当前位置: 首页 > article >正文

【算法】链表:24.两两交换链表中的节点

目录

1、题目链接 

2、题目介绍

3、解法

4、代码


 

1、题目链接 

24. 两两交换链表中的节点 - 力扣(LeetCode)

2、题目介绍

3、解法

  1. 引入伪头节点
    • 为了处理头节点可能被交换的情况,我们引入一个伪头节点(dummy node),它的next指针指向原链表的头节点。这样做可以简化边界条件的处理,因为头节点也可能需要被交换。
  2. 初始化指针
    • prevPair:记录当前处理的节点对之前的那个节点,初始化为伪头节点。
    • first:当前处理的节点对中的第一个节点,初始化为链表的头节点。
    • second:当前处理的节点对中的第二个节点,初始化为头节点的下一个节点(如果存在)。
  3. 遍历链表
    • 使用一个while循环遍历链表,条件是firstsecond都不为空。这表示还有节点对需要处理。
  4. 交换节点
    • 在每次循环中,首先记录下一对节点的起始位置(nextPairStart),即当前second节点的下一个节点。
    • 然后,交换firstsecond节点的位置。这通过调整指针来完成,而不需要移动节点本身。
    • 更新prevPair->next,使其指向新的第一个节点(原来的second节点)。
    • 更新second->next,使其指向原来的first节点。
    • 更新first->next,使其指向nextPairStart,即下一对节点的起始位置。
  5. 更新指针
    • 更新prevPair为当前处理的节点对中的第一个节点(经过交换后可能变成了第二个节点,但在这里我们总是更新为逻辑上的“第一个”,即当前对的最前端)。
    • 更新first为下一对节点的第一个节点(nextPairStart)。
    • 如果first不为空,则更新secondfirst->next;否则,将second设置为nullptr(虽然这在循环结束时自动成立,但显式设置可以提高代码清晰度)。
  6. 返回结果
    • 循环结束后,返回伪头节点的next指针,它现在指向交换后的链表的头节点。

关键点

  • 使用伪头节点简化边界条件处理。
  • 通过调整指针来交换节点,而不是移动节点本身。
  • 正确地更新所有相关的指针,以确保链表结构的完整性。

4、代码

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummy = new ListNode(0);
        dummy->next = head;  // 伪头节点  

        ListNode* prevPair = dummy;  // 记录每一对节点的前一个节点  
        ListNode* first = head;      // 当前处理的节点对中的第一个节点  
        ListNode* second = head ? head->next : nullptr;  // 当前处理的节点对中的第二个节点  

        while (first && second) {
            // 记录下一对节点的第一个一个节点  
            ListNode* nextPairStart = second->next;

            // 交换节点  
            prevPair->next = second;
            second->next = first;
            first->next = nextPairStart;

            // 更新 prevPair 和节点对  
            prevPair = first;
            first = nextPairStart;
            if (first) {
                second = first->next;
            }
            else {
                second = nullptr;
            }
        }

        return dummy->next;
    }
};


http://www.kler.cn/news/340724.html

相关文章:

  • llama3 implemented from scratch 笔记
  • HCIA——one
  • 如何使用ssm实现果蔬商品管理系统的设计与实现+vue
  • 通过真实的大学考试题目评估Chat-GPT在Swift语言上的编程能力
  • Ubuntu关闭anaconda自动进入base虚拟环境
  • LeetCode1049:最后一块石头的重量
  • windows中使用类似tree的功能
  • Json-Rpc框架(JsonCpp库使用介绍)
  • 【数据结构与算法-高阶】并查集
  • 苹果电脑磁盘满了怎么清理内存?必看清理秘籍
  • 追加word,返回中第 k 个字符的值
  • 计算机网络——ftp
  • linux基础-----基础命令+较新替代命令汇总详解
  • 【Vue】Vue2(5)
  • 2.安装keepalived详细过程
  • 前端初识之一
  • 大厂面试真题-说说AtomicInteger 线程安全原理
  • D26【python 接口自动化学习】- python 基础之判断与循环
  • 环境变量设置无效?教你如何快速定位并解决
  • 【论文速看】DL最新进展20241009-图像生成、多模态、医学扩散模型、行人重识别