为了正确反转一个链表,需调整指针指向,例如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;
}
}