两两交换链表中的节点
1. 题目
1.1. 描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
1.2. 示例
示例 1
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
1.3. 提示
- 链表中节点的数目在范围
[0, 100] 内
0 <= Node.val <= 100
2. 思路
2.1. 迭代法
- 按照题意画图
- 时间复杂度为O(n),空间复杂度为O(1)
2.2. 递归法
- 从链头遍历至链尾,交换末尾两结点,再依次往前交换
- 时间复杂度为O(n),空间复杂度为O(n)
3. 代码
3.1. C++
3.1.1. 迭代法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution { public: ListNode swapPairs(ListNode head) { ListNode ans = new ListNode(-1); ListNode p = ans; ListNode rev,tep; while(head!=NULL){ p->next=head; rev = head->next; if(rev!=NULL){ tep = rev->next; rev->next = head; head->next = tep; p->next = rev; }else{ tep = NULL; } p = head; head = tep; } return ans->next; } };
|
3.1.2. 递归法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public: ListNode* swapPairs(ListNode* head) { if(head==NULL||head->next==NULL){ return head; } ListNode* rev = head->next; head->next = swapPairs(head->next->next); rev->next = head; return rev; } };
|
3.2. Java
3.2.1. 迭代法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public ListNode swapPairs(ListNode head) { ListNode ans = new ListNode(-1); ListNode p = ans; ListNode rev,tep; while(head!=null){ p.next = head; rev = head.next; if(rev!=null){ tep = rev.next;
rev.next = head; head.next=tep; p.next=rev; }else{ tep = null; } p=head; head=tep; } return ans.next; } }
|
3.2.2. 递归法
1 2 3 4 5 6 7 8 9 10 11
| class Solution { public ListNode swapPairs(ListNode head) { if(head==null||head.next==null){ return head; } ListNode rev = head.next; head.next=swapPairs(head.next.next); rev.next = head; return rev; } }
|