一、LeetCode题 206.反转链表 206. 反转链表 - 力扣(LeetCode)
题目描述:
代码:双指针法,设置两个指针变量 pre 和 cur, 循环改变指针指向。注意循环终止条件;最后返回 pre 指针,pre 为新的 head 节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* cur = head;
while(cur != nullptr){
ListNode* tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
二、LeetCode题 24. 两两交换链表中的节点 24. 两两交换链表中的节点 - 力扣(LeetCode)
题目描述:
思路: 虚拟头节点 + 画图梳理操作先后顺序
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyhead = new ListNode;
dummyhead->next = head;
ListNode* cur = dummyhead;
while(cur->next != nullptr && cur->next->next != nullptr){
// 若最后就剩一个结点,直接跳过
ListNode* tmp = cur->next;
ListNode* tmp1 = cur->next->next;
ListNode* tmp2 = cur->next->next->next;
cur->next = tmp1; //第一步
tmp1->next = tmp; //第二步
tmp->next = tmp2; //第三步
cur = cur->next->next;
}
ListNode* result = dummyhead->next;
delete(dummyhead);
return result;
}
};
三、LeetCode题 19.删除链表的倒数第N个节点 19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
题目描述:
代码:双指针法,快慢指针,slow 指针比 fast 指针少走 n+1 步,最终 fast 指针指向 nullptr,slow 指针指向要删除结点的上一个节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyhead = new ListNode;
dummyhead->next = head;
ListNode* slow = dummyhead;
ListNode* fast = dummyhead;
while(n-- && fast->next != nullptr){
cout << n << endl;
fast = fast->next;
}
fast = fast->next;
while(fast != nullptr){
slow = slow->next;
fast = fast->next;
}
ListNode* tmp = slow->next;
slow->next = slow->next->next;
delete(tmp);
ListNode* result = dummyhead->next;
delete(dummyhead);
return result;
}
};
本文根据代码随想录顺序刷题。代码随想录 (programmercarl.com)