题目来源
本题来源为:
题目解析
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
算法原理
本题的算法还是模拟
首先画一下图:
这里我们会发现,要是两两进行交换,会影响四个节点的位置,因此我们要定义四个变量:
画图观察,交换后每个节点的指向就十分明确。
那么什么时候循环结束呢?
分两种情况:
- 节点个数为偶数时:
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,*cur=prev->next,*next=cur->next,*nnext=next->next; while(cur&&next) { //交换节点: prev->next=next; next->next=cur; cur->next=nnext; //修改节点: prev=cur; cur=nnext; //注意非法访问 if(cur) next=cur->next; if(next) nnext=next->next; } cur=newhead->next; delete newhead; return cur; } };