题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
题目分析
1、此题要求将节点两两互换位置,考虑到题目给的链表为不带头节点的链表,这个可能会导致处理上面的麻烦;
2、本题处理上更换两个节点位置需要更改的有三个节点的值,假设需要更改node1和node2的位置则需要更改node1的前驱节点的next值,node1的next值以及node2的next值,同时需要注意改变顺序,防止出现链表断开;
3、处理顺序如下:设p指向node1的前驱节点,首先node1的前驱节点指向node2;再将node1的next指向node2的next;最后将node2的next指向node1同时p指向node1;(如下图)
参考代码
/**
* 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* p = newhead;
while(p->next!=nullptr &&p->next->next!=nullptr){
ListNode* node1=p->next;
ListNode* node2=p->next->next;
p->next=node2;
node1->next=node2->next;
node2->next=node1;
p=node1;
}
return newhead->next;
}
};
总结
1、注意更换两个结点位置需要更换这两个前驱结点的值,总共涉及3个结点
2、注意更改next指向时的顺序,万万不可断开链表