目录
两两交换链表中的节点
描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2
输入:head = [] 输出:[]
示例 3
输入:head = [1] 输出:[1]
提示
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
数据结构
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; }
}
方法一:迭代
我们首先将创建一个虚拟头节点head,指向第一个节点,然后存储第一个节点为first,第二个为second,第三个为temp。
然后我们按步骤执行下面的操作:
- head.next=second
- second.next=first
- first.next=temp
这样就完成了反转,最后更新head到first节点位置,这样head就会指向下一组需要反转的节点了。
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode cur=new ListNode(0),first,second,temp,res;
cur.next=head;
res=cur;
while (cur.next!=null && cur.next.next!=null){
first=cur.next;//第一个节点
second=cur.next.next;//第二个节点
temp=second.next;//存储第二个节点后面的链表
cur.next=second;//交换位置
second.next=first;
first.next=temp;
cur=first;//更新cur节点的位置
}
return res.next;
}
}
方法二:递归
递归则是从最后的节点开始,倒过来反转链表。
最后将后面已经反转好的链表头节点返回即可。
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) return head;
ListNode temp=swapPairs(head.next.next);//递归将后面两个节点进行反转
ListNode next=head.next;//反转当前的两个节点
next.next=head;
head.next=temp;
return next;//返回当前反转好的头节点
}
}