題目:
給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
分析一:
單向鏈表找尋節點肯定是從頭往後遍歷,兩兩節點之間的交換,可以利用遞歸的思想。終止條件就是當head節點爲空(鏈表中沒有節點)以及head.next爲空(落單一個節點)。我們可以設next指向head的後一個節點,要做的就是將next指向head,而head節點指向後面的子鏈表,依次。
代碼:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode second = head.next;
head.next = swapPairs(second.next);
second.next = head;
return second;
}
}
分析二:
非遞歸的做法,首先得new一個頭節點在head的前面,防止head丟失。詳細看代碼。
代碼:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode temp = dummy;
while (temp.next != null && temp.next.next != null) {
ListNode start = temp.next;
ListNode end = temp.next.next;
temp.next = end;
start.next = end.next;
end.next = start;
temp = start;
}
return dummy.next;
}
}