Medium!
题目描述:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定1->2->3->4
, 你应该返回2->1->4->3
.
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路:
这道题不算难,是基本的链表操作题,我们可以分别用递归和迭代来实现。对于迭代实现,还是需要建立dummy节点,注意在连接节点的时候,最好画个图,以免把自己搞晕了。
C++解法一:
1 class Solution { 2 public: 3 ListNode* swapPairs(ListNode* head) { 4 ListNode *dummy = new ListNode(-1), *pre = dummy; 5 dummy->next = head; 6 while (pre->next && pre->next->next) { 7 ListNode *t = pre->next->next; 8 pre->next->next = t->next; 9 t->next = pre->next; 10 pre->next = t; 11 pre = t->next; 12 } 13 return dummy->next; 14 } 15 };
递归的写法就更简洁了,实际上利用了回溯的思想,递归遍历到链表末尾,然后先交换末尾两个,然后依次往前交换。
C++解法二:
1 class Solution { 2 public: 3 ListNode* swapPairs(ListNode* head) { 4 if (!head || !head->next) return head; 5 ListNode *t = head->next; 6 head->next = swapPairs(head->next->next); 7 t->next = head; 8 return t; 9 } 10 };