前言
对单链表还不熟悉的朋友,可以参考这篇文章顺序表 和 链表 - 单向链表部分题目
文章图片
这个题目不好讲,我直接将代码 和 解析图 给你们,需要你们自己多琢磨。当然一些重要代码部分我会注释一下!?
递归解法
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next== null){
returnhead;
}
ListNode newHead = head.next;
head.next = swapPairs(newHead.next);
newHead.next = head;
return newHead;
}
}
文章图片
代码解析图
文章图片
?
迭代
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode newHead = new ListNode();
newHead.next = head;
ListNode tmp = newHead;
while(tmp.next!=null && tmp.next.next!=null){
ListNode node1 = tmp.next;
ListNode node2 = tmp.next.next;
tmp.next = node2;
node1.next = node2.next;
node2.next = node1;
tmp = node1;
}
return newHead.next;
}
}
文章图片
代码解析
文章图片
还有一种方法 ,是通过 “栈的特性:先入后出,后进先出” 来实现了的 【链表|LeetCode - 24 - 两两交换链表中等的节点 - Java - 三种解法(递归 + 栈 + 迭代)】
文章图片
?
代码
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null){
return head;
}
Stack stack = new Stack<>();
// 创建 栈
ListNode p = new ListNode();
// 新建一个节点
ListNode cur =head;
// 创建 一个 head头节点替身,去遍历数组
head = p;
//将 head 重新指向 一个 节点,也就是说上面cur成为了真正的头节点
while(cur!=null && cur.next!=null){
stack.add(cur);
// 入栈
stack.add(cur.next);
// 入栈
cur =cur.next.next;
// 旧链表的头节点 向后移动2位,旧链表的头节点不重要,丢了就丢了
p.next = stack.pop();
// 出栈, 将旧链表的两个节点"交换"后,原先的第二个节点取出。
p = p.next;
//将其接入 新链表当中
p.next = stack.pop();
// 出栈, 将 旧链表的两个节点"交换"后,原先的第一个节点取出。
p= p.next;
//将其接入 新链表当中
}
if(cur!=null){// 节点为奇数的情况,那么需要将最后一个节点,接入新链表中
p.next = cur;
}else{// 节点为偶数的情况,那么需要将最后一个节点的next 置为 null
p.next = null;
}
return head.next;
// 最后返回 头节点的next
}
}
文章图片
推荐阅读
- JAVA|java-单链表反转解法及分析
- Programming|在单链表中删除指定值的节点-解法一(Java)
- Java毕业设计项目实战篇|Java项目:养老院管理系统(java+SpringBoot+thymeleaf+HTML+Js+mysql)
- Java毕业设计项目实战篇|Java项目:博客论坛管理系统(java+SpringBoot+JSP+LayUI+maven+mysql)
- Java毕业设计项目实战篇|Java项目:物业管理系统(java+SpringBoot+LayUI+HTML+maven+mysql)
- Java毕业设计项目实战篇|Java项目:教材管理系统(java+SSM+jsp+mysql+maven)
- 蓝桥杯|2022 第十三届 蓝桥杯 省赛 Java B组 真题 详细解析 答案
- 计算机基础|初识java虚拟机(JVM)运行时数据区结构
- JVM|JVM系列之运行时数据区与内存异常演示