[LeetCode]24. 两两交换链表中的节点(java实现)
1. 题目
2. 读题(需要重点注意的东西)
解法一(递归法):
两两交换 = 两个为一组互相交换
递归法三步:
- 终止条件:只有一个节点时,终止交换
- 本层的操作:交换当前节点与下一个节点
- 返回的值:交换好的子链表
解法二(迭代法)(更容易理解):
两两交换,如图所示
3. 解法
---------------------------解法1:递归法-----------------------------------
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
// 两两互换 = 两两为一组互换
class Solution {
public ListNode swapPairs(ListNode head) {
// 递归终止条件
if(head == null || head.next == null) return head;
ListNode node = head;
ListNode next = node.next;
ListNode nextnext = next.next;
// 每层的操作
next.next = node;
node.next = swapPairs(nextnext);
// 每层返回的是交换后的子链表(node.next)
return next;
}
}
---------------------------解法2:迭代法-----------------------------------
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
for(ListNode p = dummy;p.next != null && p.next.next != null;){
ListNode a = p.next,b = p.next.next;
p.next = b;
a.next = b.next;
b.next = a;
p = a;
}
return dummy.next;
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
链表通常有两种解法------迭代与递归。
递归法需要掌握好递归的三步,考虑清楚终止条件、本层的操作与返回值。