问题见代码,这是一段大神写的代码。但有两行我没看懂,有知道的童鞋帮忙解答下,先谢谢了!
public  Node addList2(Node head1,Node head2)  
    {   
        Stack<Integer> stack1 = new Stack<Integer>();
        Stack<Integer> stack2 = new Stack<Integer>();
        while(head1 != null){
         stack1.push(head1.data);
         head1 = head1.next;
        }
        while(head2 != null){
         stack2.push(head2.data);
         head2 = head2.next;
        }
        int n1=0;  //链表1的数值
        int n2=0;  //链表2的数值
        int n=0;  //n1+n2+ca
        int ca=0;   //进位  
          
        Node node=null; //当前节点 
        Node pnode=null;  //当前节点的前驱节点
        while(!stack1.isEmpty()||!stack2.isEmpty())  
        {  
            n1 = stack1.isEmpty() ? 0 : stack1.pop();
            n2 = stack2.isEmpty() ? 0 : stack2.pop();
            n=n1+n2+ca;  
            node=new Node(n%10);  
            node.next=pnode;//根据下一行代码,node节点next域指向它自身,为什么要指向自身
            pnode=node;//
            ca=n/10;  
        }  
          
        if(ca == 1)  
        {  
         pnode = node;
            node=new Node(n/10);  
            node.next=pnode;//问题同上
        }  
          
        return node;  
    }

解决方案 »

  1.   

    Stack是栈,放入数据的话,第一个在最下面,最上面的是最后一个数据,所以取出时是最后一个数据先出来,下一个是前一个数据。如果有十个数据放入栈的时候是10,9,8,7,6,5,4,3,2,1,;取得时候10先出,然后是9,。最后是1,所以要倒过来。
      

  2.   

    比如 node1[3,8] 入栈变成 s1[8,3],node2[5,6] 入栈变成 s2[6,5],可见栈pop,可以实现node从后面的元素开始相加(简单说就是从个位开始),否则从node的前面的元素开始相加,没法做进位处理
    其次,为啥node要next指向pnode,然后pnode再等于node呢?这实际上就是node倒排,如果一直是node的next为新的node,就相当于个位排在前,十位百位等等一直排在后,显然不符合,所以要倒过来排,让下一个新node的next等于前一个旧node
    ca是进位,最后一次进位肯定是在最前,所以不用倒排了