当前位置: 首页 > article >正文

链表专题-01

链表问题

链表回顾

数据结构分类

线性

非线性

节点结构

节点{

 	 data //数据

	 next //下一个节点的位置
  }
/**
 * 链表的节点
 * @param <E>
 */
public class ListNode<E> {
    public E element;
    public ListNode<E> next;


    public ListNode() {
    }

    public ListNode(E element) {
        this.element = element;
    }

    public ListNode(E element, ListNode<E> next) {
        this.element = element;
        this.next = next;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "element=" + element +
                ", next=" + next +
                '}';
    }
}

链表结构

image-20241007203444370

经典问题

反转链表

问题

[力扣206] 206. 反转链表 - 力扣(LeetCode)

问题描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

img

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

img

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]
解决方案
迭代法

虚拟头结点。

image-20241010151645642

image-20241007204544863

image-20241010152151081

image-20241010152413024

第二次循环

image-20241010152645209

image-20241010152913281

循环之后: 虚拟头结点连接末尾元素

image-20241010153321584

递归法

递归查找到尾节点的前一个节点(curr.next)

  • 递归跳出条件 (curr== null || curr.next == null)

image-20241010154003803

  1. 尾节点(curr.next) 连接当前节点(curr): curr.next.next = curr;

  2. 断开curr节点与前一个节点: curr.next = null;

  3. 最后一个节点反转完成,倒数第二个节点(4)断开与倒数第三个节点(3)连接。

image-20241010154901984

递归其它节点

image-20241010155732190

反转链表II

问题

[力扣92] 92. 反转链表 II - 力扣(LeetCode)

问题描述

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

img

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]
解决方案

定义虚拟头节点dummy, 要操作节点的前一个节点pre(默认为null), 寻找的反转节点的前一个节点first(默认指向dummy节点)

index记录查找到left的步数,tips:left位置从1开始计算,所以我们要寻找的位置应该left-1;

image-20241010160811119

移动first索引查找要操作的元素的前一个节点(节点1)。

image-20241010161036161

记录当前要操作的节点curr,使用curr对要求的节点进行反转操作。

  1. Node next = curr.next;
  2. curr.next = pre;
  3. pre = curr;
  4. curr = next;

image-20241010162218836

image-20241010163514401

重复执行操作2,3,4节点,出循环后

  1. first.next.next = curr; //即节点2 连接节点5
  2. first.next = pre; //即节点1连接要操作的最后一个节点

image-20241010163328626

image-20241010163813255

重复执行操作2,3,4节点,出循环后

  1. first.next.next = curr; //即节点2 连接节点5
  2. first.next = pre; //即节点1连接要操作的最后一个节点

在这里插入图片描述
在这里插入图片描述

public ListNode reverseList(ListNode head) {
        if(head==null || head.next==null) return head;

        ListNode last=reverseList(head.next);
        head.next.next=head;
        head.next=null;
        return last;
    }

http://www.kler.cn/a/538211.html

相关文章:

  • Axure原型图怎么通过链接共享
  • Linux(CentOS)安装 Nginx
  • ubuntu文件同步
  • Linux中设置开机运行指令
  • 使用 Three.js 实现热力渐变效果
  • 使用WebStorm开发Vue3项目
  • Delphi语言的云计算
  • 【免费】2011-2020年各省长途光缆线路长度数据
  • Linux 调用可执行程序
  • pytest-xdist 进行多进程并发测试
  • 网络安全 架构 网络安全架构师考试
  • Listener监听器和Filter过滤器
  • 【真一键部署脚本】——一键部署deepseek
  • 【练习】PAT 乙 1046 划拳
  • 【如何掌握CSP-J 信奥赛中的深搜算法】
  • 索引失效的14种常见场景
  • YONBIP后端环境搭建-IDEA
  • 3D数字化营销:重塑家居电商新生态
  • 对极几何方法——2D图片特征点估计运动
  • DeepSeek大模型本地部署实战
  • 【数据结构中链表常用的方法实现过程】
  • python基于深度学习的中文情感分析系统
  • AI安全最佳实践:AI应用开发安全评估矩阵(上)
  • Spring Boot:简化 Java 开发的利器
  • 24.ppt:小李-图书策划方案【1】
  • 通过C变成语言实现一个或多个算法