一、题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例:
输入: head = [1,2,3,4]
输出: [2,1,4,3]
二、思路
- 链表中节点的类不用怎么考虑,都是常见的,包含两个属性,一个val和一个next。
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
- 稍微想一下,其实就是将链表的第二项与第一项交换,第四项与第三项交换,依次下去。如果链表总共包含奇数个节点,最后一个节点不需要做任何操作。那我们就把每两个节点放在一起处理。
假设采用pointer指向链表的一个结点,然后获取node1=pointer.next与node2=pointer.next.next,更新他们俩之间的指针关系,就可以实现两两交换,之后再将pointer赋值为node1即可。
初始时,pointer指向头结点。如下图:
从图可以看出,第一步的操作,需要进行几个步骤:pointer->2,1->3,2->1,pointer=1。
之后依次进行,迭代下去,直到pointer的后面只有一个节点,或者没有节点为止,结束交换。
public ListNode swapPairs(ListNode head) {
ListNode ans=new ListNode();
ans.next=head;
ListNode pointer=ans;
while(pointer.next!=null && pointer.next.next!=null) {
ListNode node1=pointer.next;
ListNode node2=pointer.next.next;
pointer.next=node2;
node1.next=node2.next;
node2.next=node1;
pointer=node1;
}
return ans.next;
}
- 将两个节点放在一起处理,那么也可以采用递归的方法。
/**
* 两两交换链表中的节点,返回交换后链表的头结点
*/
public ListNode swapPairs(ListNode head) {
if(head==null)
return null;
if(head.next==null)
return head;
ListNode node1=head;
ListNode node2=head.next;
node1.next=swapPairs(node2.next);
node2.next=node1;
return node2;
}
对于任意一组节点,node1和node2,node1->node2->其余链表。调用node1.next=swapPairs(node2.next),就是将node2之后其余链表两两交换,交换后链表的头结点作为node1的下一个节点的意思。最后返回node2,就是新链表的头结点。