这个是双指针,前驱和当前,每遍历到一个结点,就把它的next改为前驱,直到遍历到null停下
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;//这里不是一个结点是null的原因是,这个反转链表的结尾仍然是null
//如果是一个结点会有对应的值是0,就错了
ListNode cur = head;
ListNode temp = new ListNode();
while(cur!=null){
temp = cur.next;//null
cur.next = prev;//最后一个的前一个。如果cur是5,prev就是4
prev = cur;//prev是5了
cur = temp;//最后一个是null,cur为null,prev为最后一个
}
return prev;//这里返回prev,因为prev总是在cur的前一个,所以cur为null结束,prev就为最后那个
}
}
这个我还想了一下,因为一开始我的prev是一个结点,但是我又改成null,因为反转后的链表的结尾也应该是null才正确。
比C简单好多啊,主要是C里有指针,很难,不过JAVA也算是模拟了那个过程,写一写还是能够帮助理解的,后面有机会再写C的吧