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

24. 两两交换链表中的节点

https://leetcode.cn/problems/swap-nodes-in-pairs/?envType=study-plan-v2&envId=top-100-liked
对于我们正常交换单向链表的两个节点我们需要知道三个节点的信息,
1.对于a->b->c,我们要交换a、b就要知道a、b、c三个节点,因为我们需要将a的next指向c,将b的next指向a,由于b->c这条路断了而c的next指向d,所以我们还需要保存c才能继续往下走,我们将b看作curr它每次前进两步,a看作prev,c看作next,每次使curr.next = prev, prev.next = next,然后令prev = next, curr = next.next,next = curr.next当prev或curr有一个为空就退出.
2.若对于a->b->c->d,我们要交换c、d我们就需要知道四个节点信息,b,c,d,e=d.next,d.next = c, c.next = e, b.next = d, 我们将b视作prev,c视作curr1,d视作curr2,e视作next.
所以我们需要考虑两种情况,当交换的节点包括头节点就用方法一其余用方法二

public class Solution {
    public class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode prev = null, curr1 = head, curr2 = head.next, next = curr2.next;
        //交换头节点
        curr2.next = curr1;
        curr1.next = next;
        head = curr2;
        //交换后续节点
        if(next == null || next.next == null) return head;
        prev = curr1;
        curr1 = next;
        curr2 = curr1.next;
        next = curr2.next;
        while (curr1 != null && curr2 != null) {
            curr2.next = curr1;
            curr1.next = next;
            prev.next = curr2;
            if(next == null || next.next == null) return head;
            prev = curr1;
            curr1 = next;
            curr2 = curr1.next;
            next = curr2.next;
        }
        return head;
    }
}


http://www.kler.cn/a/401375.html

相关文章:

  • 探索Python PDF处理的奥秘:pdfrw库揭秘
  • 【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析
  • 面向服务的软件工程——业务流程合规性(Business Process Compliance)(week12)
  • 基本数据类型:Kotlin、Dart (Flutter)、Java 和 C++ 的比较
  • 版本控制【Git Bash】【Gitee】
  • css 使用图片作为元素边框
  • 行列式的理解与计算:线性代数中的核心概念
  • 浅谈python
  • AI新闻周刊 | 最新AI资讯速递(11.11-11.17)
  • SMARTFORMS函数调用完整示例:打印工厂物料信息
  • 建造者模式(Builder Pattern)
  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day11(Function ECO流程)
  • [控制理论]—位置式PID与增量式PID
  • 【大数据学习 | Spark】RDD的概念与Spark任务的执行流程
  • JMeter实战技巧:使用Java Request Sampler进行接口测试
  • MySQL高级SQL技巧:提升数据库性能与效率
  • 【机器学习】机器学习中用到的高等数学知识-8. 图论 (Graph Theory)
  • Redis配置主从架构、集群架构模式 redis主从架构配置 redis主从配置 redis主从架构 redis集群配置
  • STM32完全学习——外部中断
  • 【第七节】在RadAsm中使用OllyDBG调试器
  • Android 12.0 系统默认蓝牙打开状态栏显示蓝牙图标功能实现
  • postman快速测试接口是否可用
  • css3中的多列布局,用于实现文字像报纸一样的布局
  • 解决Windows + Chrome 使用Blob下载大文件时,部分情况下报错net:ERR_FAILED 200 (OK)的问题
  • Spark RDD各种join算子从源码层分析实现方式
  • 发那科机器人-SYST-348 负载监视器报警(力)