Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list’s nodes, only nodes itself may be changed.
Example:
Given 1->2->3->4, you should return the list as 2->1->4->3.
思路:两种思路,分别是递归算法和非递归算法
非递归,多重指针操作,用三个指针不停的变换位置来交换结点,需仔细理解,想了好久,推荐还是用递归算法吧
【非递归】
package com.Medium.Ryan;
import com.Easy.wanghao.MergeTwoSortedLists.ListNode;
public class SwapNodesinPairs {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public static void main(String[] args) {
SwapNodesinPairs swapNodesinPairs=new SwapNodesinPairs();
ListNode l1=new ListNode(1);
l1.next=new ListNode(2);
l1.next.next=new ListNode(3);
l1.next.next.next=new ListNode(4);
ListNode l2=swapNodesinPairs.swapPairs(l1);
while (l2!=null) {
System.out.print(l2.val+" ");
l2=l2.next;
}
}
public ListNode swapPairs(ListNode head) {
ListNode newheadNode=head.next,firstListNode=head,secListNode=head.next,preListNode=null;
while (firstListNode!=null && secListNode!=null) {
firstListNode.next=secListNode.next;
secListNode.next=firstListNode;
if (preListNode!=null) {
preListNode.next=secListNode;
}
if (firstListNode.next==null) {
break;
}
secListNode=firstListNode.next.next;
preListNode=firstListNode;
firstListNode=firstListNode.next;
}
return newheadNode;
}
}
【递归】
package com.Medium.Ryan;
public class SwapNodesinPairs {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public static void main(String[] args) {
SwapNodesinPairs swapNodesinPairs=new SwapNodesinPairs();
ListNode l1=new ListNode(1);
l1.next=new ListNode(2);
l1.next.next=new ListNode(3);
l1.next.next.next=new ListNode(4);
ListNode l3=swapNodesinPairs.swapPairs_rec(l1);
while (l3!=null) {
System.out.print(l3.val+" ");
l3=l3.next;
}
}
public ListNode swapPairs_rec(ListNode head) {
if (head==null||head.next==null) {
return head;
}
ListNode newhead=head.next;
head.next=swapPairs(head.next.next);
newhead.next=head;
return newhead;
}
}