力扣刷题——链表
学习代码随想录,进行链表相关算法题刷题。学习中大量参考别人的思路和做题想法,刚开始也总是寸步难行,因此也想好好记录学习,希望能用自己朴素的语言理解算法题的做法,刷题中收获最多的往往也是自己总结的方式方法,希望自己能够多坚持坚持,有精力有时间就更新打卡一下自己刷题的进度,大家一起好好学习,努力奋斗。
1、反转链表
力扣序号206
该题思路:使用双指针方法对该题进行解答。
代码如下步骤:
- 定义指针cur,指向头节点head,定义指针pre指针初始化为nullptr,定义指针temp。
- 接下来进行链表的反转,首先指针temp保存cur->next,然后改变cur->next的朝向,指向pre指针,此时已经反转第一个节点。
- 开始重新移动,将指针pre赋予cur,然后指针cur赋予之前指针temp所保存的值,并且循环下去,直至cur为nullptr,也就是上一次赋值的cur->next为nullptr,因此说明最后一个节点也已经完成反转。
- 反转链表的任务完成。输出我们的指针pre,也就是我们的反转后链表的头节点。
代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = head;
ListNode* pre = nullptr;
ListNode* temp;
while (cur != nullptr) {
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
2、两两交换链表中的节点
力扣序号24
解题思路:使用虚拟头节点,正常的每次进行未来两个节点的交换即可,注意保存会被覆盖的节点。
代码如下步骤:
-
记录临时节点,记录会被覆盖和难以寻找的节点,将指针cur赋为虚拟头节点,记录
cur->next
和cur->next->next->next
。 -
cur->next = cur->next->next;
-
cur->next->next = temp1;
为之前记录的临时节点。 -
cur->next->next->next = temp2;
进入下一轮的交换。 -
指针cur移动两位。
代码如下:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead;
while (cur->next != nullptr && cur->next->next != nullptr) {
ListNode* temp1 = cur->next;
ListNode* temp2 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = temp1;
cur->next->next->next = temp2;
cur = cur->next->next;
}
return dummyHead->next;
}
};
3、删除链表的倒数第N个节点
力扣序号19
解题思路:使用虚拟头节点处理,双指针方法解决问题。
代码如下步骤:
- 定义虚拟头节点dummyHead,指针fast和slow,初始值为虚拟头节点。
- 为了实现能够走到倒数第n个节点,并且删除,我们应当走到目标点的前一个,然后
slow->next = slow->next->next;
即可删除目的。因此我们为了完成该目的,使用双指针思想。 - 让fast先行,fast先行的步数n,然后fast和slow一起动,那么两个指针之间的间距为先行的步数,倘若最后fast到了nullptr,那么倒数第n个节点为slow指向,但我们需要指向倒数第n个的前一个节点,因此我们需要fast先行时多走一步,即可达到该目的。
- 最终得到后输出
dummyHead->next
即可。
代码如下:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* fast = dummyHead;
ListNode* slow = dummyHead;
while (n-- && fast != nullptr) {
fast = fast->next;
}
fast = fast->next;
while (fast != nullptr) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};