两两交换链表中的节点
- leetcode24. 两两交换链表中的节点
- 題目描述
- 迭代法.
- 解题思路
- 代码演示
- 递归法
- 解题思路
- 代码演示
- 二叉树专题
leetcode24. 两两交换链表中的节点
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/swap-nodes-in-pairs
題目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)
示例1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
迭代法.
解题思路
因为交换相邻两个节点,只需要每次记录下来相邻的两个节点,和上一个节点就可以了,
举例:
比如图中,1 2 3 4 四个节点,交换3 4节点时,我们还要知道2 节点,保证链表不会断。因此还需要一个辅助的节点,
所以新建一个节点,同理,1,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) {
if(head == null || head.next == null){
return head;
}
//辅助节点。下一个节点指向头节点
ListNode temp = new ListNode(0);
temp.next = head;
ListNode p = temp;
//有相邻两个节点时 才交换,因此要保证两个条件同时成立
while(p.next != null && p.next.next != null){
//拿到需要交换的两个节点
ListNode n1 = p.next;
ListNode n2 = p.next.next;
p.next = n2;
n1.next = n2.next;
n2.next = n1;
//指针来到下次要交换的节点前面一个节点
p = n1;
}
return temp.next;
}
}
递归法
解题思路
要想实现递归,就先要想明白一个子过程的节点交换,只要能完成,递归下来就能把整个链表实现交换,
因此代码里,先写好一个重连的过程,再加上递归。
代码演示
/**
* 递归
*/
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null){
return head;
}
//递归每次返回下一个交换后的第一个节点,先把头节点拿到,
ListNode newHead = head.next;
//当前节点的下一个节点就是后面的交换后的第一个节点,用next 抓住
head.next = swapPairs(newHead.next);
//指针连好
newHead.next = head;
return newHead;
}
二叉树专题
leetcode652. 寻找重复的子树
leetcode701. 二叉搜索树中的插入操作
leetcode98. 验证二叉搜索树
leetcode700. 二叉搜索树中的搜索
leetcode95–不同的二叉搜索树 II
leetcode96–不同的二叉搜索树