题目
Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
思路一:递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(head==NULL || head->next==NULL)
return head;
ListNode * pre = head;
ListNode * cur = head->next;
if(pre && cur)
{
pre->next = swapPairs(cur->next);
cur->next = pre;
}
return cur;
}
};
类似于 Remove Duplicates from Sorted List II
最新 java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode pre = head;
head = head.next;
pre.next = head.next;
head.next = pre;
pre.next = swapPairs(pre.next);
return head;
}
}
思路二:迭代
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if (!head || !head->next)
return head;
ListNode *ppre = NULL, *prev = head, *curr = head->next;
while (curr) { //left at least 2 node
prev->next = curr->next;
curr->next = prev;
if (ppre)
ppre->next = curr;
else
head = curr;
ppre = prev;
prev = prev->next;
if (prev)
curr = prev->next; //left at least 1 node
else
curr = NULL; //none left
}
return head;
}
};
本文提供两种方法解决链表中每两个相邻节点交换的问题:递归和迭代。通过这两种方法,可以在常数空间内完成节点交换而不改变链表中的值。

被折叠的 条评论
为什么被折叠?



