首页 > 其他分享 >数据结构-链表

数据结构-链表

时间:2023-10-20 12:23:16浏览次数:28  
标签:current head ll next 链表 let position 数据结构

// 节点
class Node {
  constructor(element) {
    this.element = element
    this.next = null
  }
}

// 链表
class LinkList {
  constructor() {
    this.size = 0
    this.head = null
  }

  // 根据index获取节点
  getNode(index) {
    if (index < 0 || index > this.size) {
      throw new Error('out range')
    }

    let current = this.head
    for (let i = 0; i < index; i++) {
      current = current.next
    }
    return current
  }
  // 反转链表
  reverse(p = this.head) {
    // p.next 递归中指条件 p指向最后面
    if (p.next) {
      // 如果有下个指针则递归
      this.reverse(p.next)
      p.next.next = p
      p.next = null
    } else {
      this.head = p
    }
  }

  // 追加元素
  append(element) {
    let node = new Node(element)
    if (this.head === null) {
      // 第一次初始化
      this.head = node
    } else {
      // 链表中有内容
      // 获取当前的最后一个节点
      let current = this.getNode(this.size - 1)
      current.next = node
    }

    this.size++
  }
  // 特定位置添加
  appendAt(position, element) {
    if (position < 0 || position > this.size) {
      throw new Error('position out range')
    }
    let node = new Node(element)

    if (position === 0) {
      // 如果在最前添加
      node.next = this.head
      this.head = node
    } else {
      // 如果在中间添加
      let pre = this.getNode(position - 1)
      node.next = pre.next
      pre.next = node
    }
    this.size++
  }
  // 删除特定链表
  removeAt(position) {
    if (position < 0 || position >= this.size) {
      throw new Error('position out range')
    }
    let current = this.head
    if (position === 0) {
      // 删除头
      this.head = current.next
    } else {
      let pre = this.getNode(position - 1)
      current = pre.next
      pre.next = current.next
    }
    this.size--
  }
  // 查找指定元素索引
  indexOf(element) {
    let current = this.head
    for (let i = 0; i < this.size; i++) {
      if (current.element === element) {
        return i
      }
      current = current.next
    }
    return -1
  }
}

let ll = new LinkList()
ll.append(1)
ll.append(2)
// ll.append(3)
// ll.append(4)
ll.appendAt(2, 3)
ll.appendAt(3, 4)
// ll.appendAt(3, 2)
// ll.removeAt(1)
// console.log(ll.indexOf(1))
console.log(ll.reverse())
console.dir(ll, {
  depth: 100,
})

 

标签:current,head,ll,next,链表,let,position,数据结构
From: https://www.cnblogs.com/jia460/p/17776785.html

相关文章

  • 数据结构之美:如何优化搜索和排序算法
    文章目录搜索算法的优化1.二分搜索2.哈希表排序算法的优化1.快速排序2.归并排序总结......
  • 数据结构:实验一+实验二
    数据结构:实验一数据结构:实验二......
  • 面试必刷TOP101:6、判断链表中是否有环
    一、题目二、题解2.1双指针我们使用两个指针,fast与slow。它们起始都位于链表的头部。随后,slow指针每次向后移动一个位置,而fast指针向后移动两个位置。如果链表中存在环,则fast指针最终将再次与slow指针在环中相遇。importjava.util.*;/***Definitionforsingly-linke......
  • 数据结构与算法 | 链表(Linked List)
    链表(LinkedList)链表(LinkedList)是一种线性数据结构,它由一系列节点(Node)组成,每个节点包含两部分:数据和指向下(上)一个节点的引用(或指针)。链表中的节点按照线性顺序连接在一起(相邻节点不需要存储在连续内存位置),不像数组一样存储在连续的内存位置。链表通常由头节点(Head)来表示整个链......
  • 《数据结构》王卓老师 p48-p62学习反馈
    跟着青岛大学-王卓老师的视频进行到链队列时,运行链队列代码的时候遇到了两个问题:1.)ProgramreceivedsignalSIGSEGVSegmentationfault附代码: #include<stdio.h> #include<stdlib.h> typedefchar ElemType; typedefstructqnode{ ElemTypedata; structq......
  • S - 数据结构复习 E. 第K大和
    题目链接妙妙题!难度:Medium-。题意给定一个\(1\simn\)的全排列\(A_1,A_2,\cdots,A_n\)。给定一个\(k\),统计所有长度\(\geqk\)的子区间的第\(k\)大的数的和。\(n\leq5\times10^5\),\(k\leq\min(n,80)\)。题解考虑如果\(k=1\)怎么做。显然算每个数对答案的贡献......
  • LeetCode142. 环形链表 II
    题目描述给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • LeetCode02.07. 链表相交
    描述给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。示例提交的代码publicclassSolution{publicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){//分别计算A和B链表......
  • 数据结构——图
    图的基本概念图是由顶点集合及顶点间的关系组成的一种数据结构:G=(V,E)其中:顶点集合V,边集合EV={x|x属于某个数据对象集}E={(x,y)|x,y属于V}(x,y)表示点x到点y的一条双向通路,是无方向的顶点:图中的节点,第几个顶点记作vi两个顶点vi和vj相关联称为顶点vi到顶点vj之间的一条边图分为有向图和......
  • 小白学算法-什么是矩阵数据结构以及有哪些应用?
    什么是矩阵数据结构以及有哪些应用矩阵表示按行和列的顺序排列的数字的集合。必须将矩阵的元素括在圆括号或方括号中。例如:具有9个元素的矩阵如下所示。该矩阵M有3行和3列。矩阵M的每个元素都可以通过其行号和列号来引用。例如,M[2][3]=6。矩阵是由行和列组成的二维数组。......