定义两个指针:
prev 和 curr, prev 在前 curr 在后。ListNode = null, ListNode curr = head;
每次让 curr 的 next 指向 prev ,实现一次局部反转curr.next = prev;
局部反转完成之后, prev 和 curr 同时往前移动一个位置prev = cur;cur = nextNode;
循环上述过程,直至 prev 到达链表尾部
注意:要先移动prev再移动curr,即prev = cur;cur = nextNode
,这样刚好prev在curr的前一个位置,如果cur = nextNode;prev = cur;
会导致prev和curr重叠。
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode nextNode = curr.next;
curr.next = prev;
prev = curr;
curr = nextNode;
}
// 循环结束时,cur == null,所以返回prev
return prev;
}
}