剑指15----单链表反转,返回反转后链表头结点(360测试实习生面试题)

为了正确反转一个链表,需调整指针指向,例如i,m,n是3个相邻结点,假设结点i之前的指针已调整完毕,,这些结点的next指针都指向前面一个结点,遍历到结点m时,需要调整结点的next指针,避免链表断开,在调整之前需保存n,然后找反转后链表的头结点(即原链表的尾结点,next为空指针的结点)

 

class Node{
    int data;
    Node next;
    public Node(int data){
        this.data=data;
    }
}
public class ListReverse {

    public static void main(String[] args){
        Node n1=new Node(5);
        Node n2=new Node(3);
        Node n3=new Node(9);
        Node n4=new Node(2);
        n1.next=n2;
        n2.next=n3;
        n3.next=n4;
        Node n=new ListReverse().reverse(n1);
        System.out.println(n.data);

    }
    public  Node reverse(Node head){
        Node preNode=null;
        Node curNode=head;
        Node nextNode=null;
        while(curNode!=null){
            nextNode=curNode.next;
            if(nextNode==null) {
                return curNode;
            }
            curNode.next=preNode;
            preNode=curNode;
            curNode=nextNode;
        }
        return preNode;
    }
}

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null) {			
            return null;		
        }		
        ListNode pre=null;		
        ListNode next=null;		
        while(head!=null) {			
            next=head.next;//让next引用指向head下一个节点,			
            head.next=pre;//pre始终指向当前head的前一个节点,这样可以反转节点了。			
            pre=head;			
            head=next;		
        }		
        return pre;

    }
}

 

 

你可能感兴趣的:(剑指)