leetcode206:题目链接
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
思路:
双指针(三指针):
试想链表中间有一个元素(cur指针指向),我们要达成的目的是反转链表,要让当前的元素中的指针指向前一个元素,但是由于单向链表中的元素只储存了下一个元素的指针(无法通过当前元素找到上一个元素从而让当前元素指向上一个元素),所以这时我们需要定义一个指针指向当前元素的上一个元素(pre指针),我们只需要“cur.next = pre”就可以达到“局部的反转”。那么现在问题来了,元素连接到上一个元素之后,就断开了连接下个元素的桥梁(因为一个元素中只存一个指针/引用),那么在遍历的时候就无法遍历到下一个元素了,所以我们还需要定义一个指针指向当前元素的下一个元素(temp指针)。
代码如下:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null){return head;}
ListNode pre = null;
ListNode cur = head;
ListNode temp = head.next;
while(temp != null){
cur.next = pre;
pre = cur;
cur = temp;
temp = temp.next;
}
cur.next = pre;
head = cur;
return head;
}
}