24 两两交换链表中的节点
思路简单,但是操作的时候还是要注意细节,特别是某些结点的next指针变化需要格外关注,报了很多次错。因为没注意到:每次替换两个结点后,应该让当前的后面的结点指向下两个结点的靠后一点的结点。主要还是画完图后没有走一遍链表
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* left = head;
if (left== NULL) return head;
ListNode* right = left->next;
if (right == NULL) return head;
ListNode* newhead = right;
while(left != nullptr && left->next != nullptr)
{
left->next = right->next;
right->next = left;
ListNode* temp1 = left->next;
if(temp1 == NULL) break;
else
{
ListNode* temp2 = temp1->next;
if(temp2 == NULL) break;
else
{
left->next = temp2;//如果没有这一步就会导致链表断开
left = temp1;
right = temp2;
}
}
}
return newhead;
}
};
后面去看了别人使用虚拟头结点代码,思路也是差不多。不过确实要简洁不少。使用虚拟头结点时还有考虑虚拟结点的移动,自己写的时候感觉是按照next的顺序来改变next不容易混乱
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur =dummyHead;
while(cur->next != nullptr && cur->next->next != nullptr)
{
ListNode* temp1 = cur->next;
ListNode* temp2 = cur->next->next;
cur->next = temp2;
temp1->next = temp2->next;//保证链表不断开
temp2->next = temp1;
cur = temp1;
}
ListNode* res = dummyHead->next;
return res;
}
};

浙公网安备 33010602011771号