LeetCode 206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
双指针
基本思路:局部两个相邻指针反转
pre:前一个指针
cur:当前指针
开始是这样的:
初始化三个指针,这里还要维护一个temp指针【保存cur的下一个节点,因为接下来要改变cur->next】
第一次循环 局部反转
最后一次循环 跳出循环的条件 最后返回pre指针
class Solution {
public:
ListNode* reverseLists(ListNode* head) {
ListNode* pre = NULL;
ListNode* cur = head;
ListNode* temp = NULL;
while (cur != NULL){
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
递归思路
假设链表为:
若从节点n(k+1)到
n
m
n_m
nm已经被反转,而我们正处于
n
k
n_k
nk
我们希望n(k+1)的下一个节点指向
n
k
n_k
nk
n(k+1)->next->next = nk
需要注意的是 n 1 n_1 n1的下一个节点必须指向空。如果忽略了这一点,链表中可能会产生环。
ListNode* reverseList(ListNode* head) {
if(head == nullptr || head->next == nullptr) {
return head;
}
ListNode* newhead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newhead;
}