题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
解题思路:
我们可以通过改变链表的指向来解决这道题。
我们以1->2->3->4为例。
-
定义一个新链表res.next指向原链表。
-
因为两两交换涉及到三个节点,我们需要定义一个中间指针指向res方便返回修改后的链表,以及指向head节点、指向第二个节点的nxt、第三个节点的tem。
-
交换完链表后,移动上面的指针位置,重复上述操作。
解题代码:
/**
* Definition for singly-linked list.
* 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; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
//定义一个指针指向head
ListNode res = new ListNode();
res.next=head;
ListNode cur=res;
while (cur.next!=null&&cur.next.next!=null){
ListNode nxt=head.next;
ListNode tmp=nxt.next;
//交换
cur.next=nxt;
nxt.next=head;
head.next=tmp;
//交换完之后移动位置
cur=head;
head=head.next;
}
return res.next;
}
}