算法通关村第二关——两两交换链表相邻节点问题解析

240 阅读1分钟

两两交换链表中的节点

对应 leetcode 24. 两两交换链表中的节点

本题和指定区间反转链表很相似,可以想象成有k个区间需要反转链表;事实也确实是这样,但是每两个相邻的节点真有必要使用到指定区间反转时用到的穿针引线法这么麻烦吗?答案是没必要;

解题方法:

首先创建一个虚拟节点 dummy ,使用该节点可以省去原链表head发生改变时复杂的分类讨论;

原链表为 dummy(虚拟节点) -->node1 -->node2 -->node3 --> node4, 第一次相邻链表反转后的结果应该变为 dummy(虚拟节点) -- > node2 --> node1 -->node3 -->node4; 同样的第二次相邻链表交换后结果为 dummy(虚拟节点) -- > node2 --> node1 -->node4 -->node3 ;

我们只要保证链表中的每两个相邻节点都处于这样一个过程中,那么问题就迎刃而解了;问题就在于怎么维持这样一个过程?

用图解的方式帮助我们更好的理解:

image.png

image.png

image.png

完整代码如下:

public static ListNode swapPairs(ListNode head) {
    if(head == null){
        return head;
    }
    ListNode dummyNode=new ListNode(0);
    dummyNode.next=head;
    ListNode temp=dummyNode;
    while(temp.next!=null && temp.next.next!=null){
        ListNode node1=temp.next;
        ListNode node2=temp.next.next;
        temp.next=node2;
        node1.next=node2.next;
        node2.next=node1;
        temp=node1;
    }
    return dummyNode.next;
}

运行结果:

image.png 问题得以解决!!!