两两交换链表中的节点-LeetCode24模拟节点
力扣链接:https://leetcode.cn/problems/swap-nodes-in-pairs/
题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例2:
输入:head = [] 输出:[]
示例3:
输入:head = [1] 输出:[1]
当拿到这个题目,我相信很多人跟我一样,比较蒙蔽了,这怎么交换啊?这个题目需要去模拟,待我一一来分析。
思路
建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。接下来就是交换相邻两个元素了,此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序初始时,cur指向虚拟头结点,然后进行如下三步(来自代码随想录):
操作之后,链表如下:
看这个可能就更直观一些了:
看完这个过程是不是理解很多了,本人也是。
由此我们可以写出我们的代码:
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dm=new ListNode(0);
dm.next=head;
ListNode curr=dm;
while(curr.next!=null && curr.next.next!=null){
ListNode temp1=curr.next;
ListNode temp2=curr.next.next.next;
curr.next=curr.next.next;
curr.next.next=temp1;
curr.next.next.next=temp2;
curr=curr.next.next;
}
return dm.next;
}
}
首先我们先建立一个虚拟头结点,然后定义一个curr节点指定这个虚拟头结点。然后判断该节点后两个节点是否为空,不为空可以开始交换了。先用两个变量记住图中1,3节点,按照上面交换进行,curr指向2节点,2节点指向1节点,1节点指向3节点,最后将当前节点位置向后移动两位,就可以开始交换下两个节点的位置了。
其实还有递归方法可以解决,代码如下:
class Solution { public ListNode swapPairs(ListNode head) { if(head == null || head.next == null){ return head; } ListNode next = head.next; head.next = swapPairs(next.next); next.next = head; return next; } }
怎么样,模拟以后是不是感觉简单很多了,很多题目需要自己动手去尝试!!!