• 详解两两交换链表中的节点


    前言

    LeetCode连接

    题目: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

    什么是只进行节点交换,什么是值交换呢?

    值交换:仅仅将链表中的val值进行交换

    节点交换:是节点整个对象进行交换


    学习 本节需要参考博主之前的关于节点创建的文章

    一文读懂移除链表元素_abc123mma的博客-CSDN博客

    一、链表节点交换

    从LeetCode的题目中可以得出链表交换的交换也分为3部分

    详细分析请参考:另一篇博文详解反转链表_abc123mma的博客-CSDN博客

    基本分析如下:

    • 实例1就如前言中的图所示,链表中节点两两交换
    • 实例2就是头节点head 为null 直接返回null
    • 实例3是只有一个节点,即为头节点之间返回head即可

    二、具体步骤

    首先设置cur结点指向虚拟头结点;为了方便表示这里的虚拟头节点省略了。

    按照指定顺序操作链表

    【1】表示cur节点指向2节点

    【2】表示1节点指向3节点

    【3】表示2节点指向1节点

    【操作链表后】

     【下一次循环前】:cur 要移动到节点1这个位置开始对节点3和4进行操作。

    cur = cur.next.next;

    【循环结束条件】:因为要保证两两交换,所以每次交换时候不能少于两个节点

      因此结束条件为:

    cur.next != null && cur.next.next != null

    1.当节点数是偶数时,cur.next==null时,循环终止。
    2.当节点数是奇数时,因为最后一个节点不用交换,所以当cur.next.next==null时,循环终止

    代码

    1. package link;
    2. import static link.ListNode.print;
    3. public class SwapLinkNode {
    4. public static void main(String[] args) {
    5. ListNode node1 = new ListNode(1);
    6. ListNode node2 = new ListNode(2);
    7. ListNode node3 = new ListNode(3);
    8. ListNode node4 = new ListNode(4);
    9. node1.next = node2;
    10. node2.next = node3;
    11. node3.next = node4;
    12. System.out.println("=========交换前=========");
    13. print(node1);
    14. ListNode node = swapPairs(node1);
    15. System.out.println("=========交换后=========");
    16. print(node);
    17. }
    18. public static ListNode swapPairs(ListNode head) {
    19. // 空节点
    20. if (head == null) {
    21. return null;
    22. }
    23. // 只有一个节点
    24. if (head.next == null) {
    25. return head;
    26. }
    27. ListNode dummy = new ListNode();
    28. dummy.next = head;
    29. ListNode cur = dummy;
    30. while (cur.next != null && cur.next.next != null) {
    31. ListNode temp = cur.next;
    32. // 步骤1
    33. cur.next = temp.next;
    34. // 步骤2
    35. ListNode temp2 = cur.next.next;
    36. cur.next.next = temp;
    37. // 步骤3
    38. temp.next = temp2;
    39. // 每次循环往后移动两个节点
    40. cur = cur.next.next;
    41. }
    42. return dummy.next;
    43. }
    44. }

    结果

  • 相关阅读:
    苹果“欠”用户的承诺,何时会兑现?
    某音吸粉最快的10种方法
    数据中台模块介绍
    Armadillo矩阵库在Visual Studio软件C++环境中的配置方法
    idea连接kerberos认证的hive
    高云FPGA系列教程(8):ARM串口数据接收(中断和轮询方式)
    【LeetCode144、145、94. 二叉树遍历】——递归算法、利用栈
    Rust核心功能之一(所有权)
    基于单片机的步进电机驱动控制系统的设计与实现
    状态压缩dp,91. 最短Hamilton路径
  • 原文地址:https://blog.csdn.net/abc123mma/article/details/127400377