题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 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);
}
}
}