題目:
給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
思路:
考察鏈表的節點交換操作,具體交換如下圖
代碼:
/**
* 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) return null;
ListNode p,q,pre=null;
p=head;
q=p.next;
while(p!=null&&q!=null){
p.next = q.next;
if(pre!=null){
pre.next = q;
}else{
head = q;
}
q.next = p;
pre = p;
p = pre.next;
if(p!=null){
q = p.next;
}else{
q = null;
}
}
return 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 q = head.next;
swapNode(head,head.next,null);
return q;
}
public void swapNode(ListNode p,ListNode q,ListNode pre){
if(p!=null&&q!=null){
p.next = q.next;
if(pre!=null){
pre.next = q;
}
q.next = p;
pre = p;
p = pre.next;
if(p!=null){
q=p.next;
}else{
q=null;
}
swapNode(p,q,pre);
}
}
}