单链表问题

  1. 单链表节点定义

class Node {
    public ele: any;
    public next: null;

    constructor(ele) {
        this.ele = ele;
        this.next = null;
    }
}

2. 单链表基本操作

  • 插入 `insert(ele, pos)`

  • 查询 `get(pos)`

  • 删除 `remove(pos)`

  • 获取头节点 `getHead()`

  • 获取链表长度 `getSize()`

  • 判断链表是否为空 `isEmpty()`

  • 获取链表节点数组 `getList()`

3. 基本操作实现

4. 单链表高级操作

4. 1 链表合并

将两个升序链表合并为一个新的升序链表并返回,新链表是通过拼接给定的两个链表的所有节点组成的

4. 2 链表环检测

给定一个链表,判断链表中是否有环

方法1: 标记法

遍历链表,给已遍历过的节点加标志位

方法2:`JSON.stringify`

`JSON.stringify`序列化含有循环引用结构会报错

方法3:双指针

快慢指针: 遍历单链表,快指针一次走两步,慢指针一次走一步

如果单链表中存在环,则快慢指针终会指向同一个节点,否则直到快指针指向 null 时,快慢指针都不可能相遇

4.3 链表中间元素

求链表的中间结点,节点个数为偶数2n时返回n+1所在节点

快慢指针: 遍历单链表,快指针一次走两步,慢指针一次走一步

快指针走到尾节点的时候就是满指针走到中间的时候

4.4 链表反转

方法1: 迭代法(三指针法)

使用三个指针prev, cur和next实现

next在遍历链表的时候临时保存cur的下一个节点

prev初始值为null,遍历链表的时候反转cur的指向到prev

prev和cur分别前移

方法2: 递归

4.5 链表求和

给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。

4.6 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。

方法1:遍历链表将节点值放入数组,然后双指针 复杂度:O(n) O(n)

方法2:前半部分指针反转一下,然后再判断回文 复杂度:O(n) O(1)

4.7 链表排序

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

Last updated

Was this helpful?