💫没有一蹴而就的改变,只有日复一日的坚持。
学习日期:2025年1月20日22:58:12
学习内容:代码随想录-两两交换链表中的节点
学习时长:1h20min
练习题目
题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路
- 整体思路/注意事项
- 奇/偶节点
dummyHead
好用cur
指针的指向 :要交换的两个节点的前一个节点
- 代码实现
- 遍历的终止条件:
cur->next!=null
偶数;cur->next->next!=null
奇数
注:先判断cur->next!=null
注意
"节点1"
的临时保存:temp1=cur->next
关键"节点3"
的临时保存:temp2=cur->next—>next->next
关键- 节点的交换
cur
的移动:cur=cur->next->next
return dummyHead->next
Bug
错误:dummyHead
是新建一个节点,应该通过类函数进行初始化定义。new
ListNode* dummyHead=new ListNode(0);
与cur/temp
不同,dummyHead
是一个节点,cur/temp
是一个指针 存疑
/**
* 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(0);
dummyHead->next=head;
ListNode* cur=dummyHead;
while(cur->next!=0&&cur->next->next!=0){
ListNode* temp1=cur->next;
ListNode* temp2=cur->next->next->next;
cur->next=cur->next->next;
cur->next->next=temp1;
cur->next->next->next=temp2;//节点1/2的交换
cur=cur->next->next;//cur指针的移动
}
return dummyHead->next;
}
};
学习总结
- 节点是否需要临时保存,画图分析,改变
cur->next
之后,删掉原来的指针,分析时候能找到后面的指针,避免出现空指针错误。注意 new
的理解 待完成