[程序员面试金典]-链表反转

package niuke;

public class MaxNum {
    //链表反转
    public ListNode reverseList(ListNode pHead){
        if(pHead==null)
            return null;
        ListNode pre=null;
        //ListNode cur=pHead.next;
        //ListNode tmp;
        //pHead.next=null;
        while(pHead!=null){
            ListNode tmp=pHead.next;
            pHead.next=pre;
            pre=pHead;

            pHead=tmp;  
        }
        return pre;
    }
    //递归版本
    public ListNode reverseList2(ListNode pHead){

        if(pHead==null||pHead.next==null)
            return pHead;
        // pHhead看作是前一结点,pHead.next是当前结点,reHead是反转后新链表的头结点  
        ListNode reHead = reverseList2(pHead.next);// 先反转后续节点pHead.next  
        pHead.next.next=pHead;// 将当前结点的指针域指向前一结点  
        pHead.next=null;// 前一结点的指针域令为null;  
        return reHead;// 反转后新链表的头结点  
    }
    public void showNode(ListNode pHead){
        if(pHead==null) return;
        int count=0;
        while(pHead!=null){
            System.out.println("第"+count+"次:"+pHead.val);
            pHead=pHead.next;
            count++;
        }
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ListNode head=new ListNode(1);
        ListNode head1=new ListNode(5);
        ListNode head2=new ListNode(4);     
        ListNode head3=new ListNode(2);
        ListNode head4=new ListNode(6);
        ListNode head5=new ListNode(7);
        head.next=head1;
        head1.next=head2;
        head2.next=head3;
        head3.next=head4;
        head4.next=head5;
        head5.next=null;

        MaxNum mn=new MaxNum();
        System.out.println("调用函数前:");
        mn.showNode(head);

        ListNode head_new=mn.reverseList(head);
        System.out.println("调用函数后:");
        mn.showNode(head_new);
    }
}

结果如下:

调用函数前:
第0次:1
第1次:5
第2次:4
第3次:2
第4次:6
第5次:7
调用函数后:
第0次:7
第1次:6
第2次:2
第3次:4
第4次:5
第5次:1

你可能感兴趣的:(程序员面试金典)