1 翻转链表
leetcode link:https://leetcode.cn/problems/reverse-linked-list/description/
描述:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
Notes:
- 1 添加一个虚拟节点,该虚拟节点指向头结点,用于统一插入和删除操作。
- 2 while循环内使用cur->next != nullptr 作为判断条件,即头结点到尾节点都存在
- 3 函数内部主体
- 记录断链的节点
- 主体逻辑(链接、插入或者删除)
- 更新cur指针
- 4 删除虚拟节点
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp; // 保存cur的下一个节点
ListNode* cur = head;
ListNode* pre = NULL;
while(cur) {
temp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->next
cur->next = pre; // 翻转操作
// 更新pre 和 cur指针
pre = cur;
cur = temp;
}
return pre;
}
};
2 两两交换链表中的几点
leetcode link: https://leetcode.cn/problems/swap-nodes-in-pairs/description/
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
ListNode* cur = dummyHead;
while(cur->next != nullptr && cur->next->next != nullptr) {
// 1 记录断链节点
ListNode* tmp = cur->next; // 记录临时节点
ListNode* tmp1 = cur->next->next->next; // 记录临时节点
// 2 主体逻辑
cur->next = cur->next->next; // 步骤一
cur->next->next = tmp; // 步骤二
cur->next->next->next = tmp1; // 步骤三
// 3 更新cur指针
cur = cur->next->next; // cur移动两位,准备下一轮交换
}
ListNode* result = dummyHead->next;
delete dummyHead;
return result;
}
};