两两交换链表的节点
两两交换链表节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
例如:
给定 1->2->3->4, 你应该返回 2->1->4->3。
在看到这道题目的时候,我感觉很简单,可能就是边界条件需要注意一下,我们需要一个指针在整个链表上进行移动,这个指针每次都是移动两步。这样的话基本就可以实现两两交换
代码如下
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if (head == nullptr || head->next == nullptr)
return head;
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* pre = dummy->next;
ListNode* next = pre ->next;
while (pre && next){
int temp = next->val;
next->val = pre->val;
pre->val = temp;
pre = pre->next->next;
if (pre)
next = pre ->next;
}
return dummy->next;
}
};
实现了两两互换,但是发现运行的效率非常的低,双\(5\%\),看见了题目的要求:你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换
在具体实现上,我们创建头结点,然后在交换上,改变节点之间的连接关系,那么就需要这两个需要交换顺序节点的先前结点,在下面的程序中,temp节点其实就是那个先前的节点。在进行交换的时候,需要设置两个变量对需要交换的节点进行记录。方便我们的实现。
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* temp = dummyHead;
while (temp->next != nullptr && temp->next->next != nullptr) {
ListNode* node1 = temp->next; // pre
ListNode* node2 = temp->next->next; // next
temp->next = node2;
node1->next = node2->next;
node2->next = node1;
temp = node1;
}
return dummyHead->next;
}
};