赞
踩
题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:输入:head = []
输出:[]
示例 3:输入:head = [1]
输出:[1]
-
- class Solution {
- public:
- ListNode* swapPairs(ListNode* head) {
- ListNode* dummy = new ListNode(0);
- dummy->next = head;
-
- //0 -> 1 -> 2
- //preNode curNode curNextNode
- ListNode* preNode = dummy,*curNode = dummy->next;
- while(curNode && curNode->next){
- ListNode* curNextNode = curNode->next;
-
- //交换节点
- curNode->next = curNextNode->next;
- curNextNode->next = curNode;
- preNode->next = curNextNode;
-
- //指针后移
- //preNode = preNode->next->next;
- preNode = curNode;
- curNode = curNode->next;
- }
- return dummy->next;
- }
- };
-
-
使用三个指针(preNode, curNode, curNextNode)分别指向虚拟头节点以及要交换的两个节点
交换节点时先连接后面再连接前面,防止后面的节点丢失。因此先让curNode节点连接curNextNode节点的下一个节点, 然后curNextNode节点连接curNode节点, 最后preNode节点连接curNextNode节点
注意交换之后, curNode与curNextNode的位置发生了交换, 因此在向后移动三个节点时应注意
因为curNode节点位置与curNextNode节点位置发生了改变, 因此向后移动preNode节点时,可以让preNode = preNode->next->next, 也可以直接让preNode = curNode。curNode = curNode->next, 而不是(curNode = curNode->next->next), 因为curNode节点位置与curNextNode节点位置发生了改变。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。