24. 两两交换链表中的节点【迭代】

https://leetcode-cn.com/problems/swap-nodes-in-pairs/
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

我的方法一:迭代

步骤

  1. 每两个节点进行处理,node1和node2分别表示当前2个节点的首节点和尾节点;pre节点表示上一对节点的尾节点;
    1.1 交换两个节点,并pre指向交换后的首节点;尾节点指向后一对节点;
  2. Sentinel节点表示一个哑节点,指向当前第一个节点,为了处理上非空判断的方便;pre也指向Sentinel;
  3. 当最后一对节点都为空,或者有一个为空时,就停止

初始条件

  1. Sentinel指向head;
  2. node1指向head,node2指向head的next
  3. pre指向Sentinel

边界条件

  1. node1为空,或者node2为空

复杂度

时间复杂度:O(N),因为遍历一遍即可
空间复杂度:O(1),只需要Sentinel、node1、node2、pre等固定的几个辅助空间

代码

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode sentinel;
        sentinel.next = head;
        ListNode* node1 = head;
        ListNode* node2 = head ? head->next:0;
        ListNode* pre = &sentinel;
        ListNode* next_couple = 0;//for swap

        while(node1 && node2){
            pre->next = node2;
            next_couple = node2->next;

            node2->next = node1;
            node1->next = next_couple;

            pre = node1;

            node1 = next_couple;
            node2 = next_couple?next_couple->next:0;
        }

        return sentinel.next;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。