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

前言

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

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

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

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


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

一、链表节点交换

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

详细分析请参考:另一篇博文

基本分析如下:

    实例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时,循环终止

代码

package link;

import static link.ListNode.print;

public class SwapLinkNode {
    public static void main(String[] args) {
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        System.out.println("=========交换前=========");
        print(node1);
        ListNode node = swapPairs(node1);
        System.out.println("=========交换后=========");
        print(node);
    }

    public static ListNode swapPairs(ListNode head) {
        // 空节点
        if (head == null) {
            return null;
        }
        // 只有一个节点
        if (head.next == null) {
            return head;
        }
        ListNode dummy = new ListNode();
        dummy.next = head;
        ListNode cur = dummy;
        while (cur.next != null && cur.next.next != null) {
             ListNode temp = cur.next;
             // 步骤1
             cur.next = temp.next;
             // 步骤2
             ListNode temp2 = cur.next.next;
             cur.next.next = temp;
             // 步骤3
             temp.next = temp2;
             // 每次循环往后移动两个节点
             cur = cur.next.next;
        }
        return dummy.next;
    }
}

结果

经验分享 程序员 微信小程序 职场和发展