个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创链表(2)_两两交换链表中的节点_面试题
收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌
目录
1. 题目链接
2. 题目描述
3. 解法
算法思路:
代码结果展示:
1. 题目链接
OJ链接 : 两两交换链表中的节点
2. 题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
3. 解法
算法思路:
创建一个虚拟头节点, 利用四个指针(方便我们找到后面的节点)将符合规则的节点插入虚拟头节点处, 最后返回时, 一定别要忘记释放我们的虚拟头节点, 不然会造成内存泄漏!
边界情况处理:
节点个数为偶数时:
节点个数为奇数时:
当我们cur或者next为空时, 我们的循环就应该结束, 不然就会造成空指针解引用~~
代码结果展示:
/*** 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) {if(head == nullptr || head->next == nullptr) return head;ListNode* newhead = new ListNode(0);newhead->next = head;ListNode* prev = newhead, *next = prev->next, *cur = next->next, *nnext = cur->next; while(next && cur){prev->next = cur;cur->next = next;next->next = nnext;prev = next;next = nnext;if(next) cur = next->next;if(cur) nnext = cur->next;}cur = newhead->next;delete newhead;return cur;}
};
一定要注意边界问题, 建议多画画图!!!