算法day11 两两交换链表中的节点

题目描述

思路:

这道题的关键就在于我们在交换两个节点的时候如何正确的保留下一组要处理的节点的位置,不要使链表断开导致丢失陷入死循环或未知情况。处理时我们依旧采用虚拟头节点的操作方式从而统一整个链表的操作流程,这样就可以不用单独考虑头节点的处理情况。在我们首先创建虚拟头节点dummyhead,使其指针域指向head,随后,我们使用一个临时指针cur使其代替dummyhead进行操作。每一次,我们使当前cur->next = cur -> next -> next,这时我们会丢失处理前的cur->next(初始时即head),所以我们应该创建一个临时指针保存它,随后进行指针指向处理,待指向处理过后,我们会发现我们丢失了这组交换节点之后的节点,所以我们还应该在操作前提前存储下一次要迭代的cur指针位置。循环在何时结束呢?这里我们应该考虑一下链表元素数量奇偶的情况,当为奇数时,实际上cur->next->next为空时我们才真正的来到了结尾,而偶数时则为cur->next。这里如果模糊的话,可以画两个链表推一下。最后完成后返回实际意义的头指针dummyhead->next。

代码如下:

  ListNode* swapPairs(ListNode* head) {
    ListNode dummyhead(0);
    dummyhead.next = head;
    ListNode *cur  = &dummyhead;
    ListNode *temp1;
    ListNode *temp2;
    while(cur->next&&cur->next->next){
        temp1 = cur -> next;
        temp2 = temp1->next->next;
        cur->next = cur -> next -> next;
        cur ->next->next = temp1;
        cur ->next->next->next = temp2;
        cur = temp1;
    }
 
   return dummyhead.next;
}

时间复杂度:O(n)
空间复杂度:O(1)

END

posted on 2025-04-15 22:36  sakura430  阅读(11)  评论(0)    收藏  举报