zoukankan      html  css  js  c++  java
  • 数据链表之单链表实现

    实现一个单链表及相关注释

     1 function LinkList() { // 单链表
     2   // 节点
     3   let Node = function(element) {
     4     this.element = element
     5     this.next = null
     6   }
     7 
     8   // 初始头节点
     9   let head = null
    10 
    11   // 链表长度
    12   let length = 0
    13 
    14   // 操作 operation
    15   this.getList = function() {  // 获取列表
    16     return head
    17   }
    18   // 思路:遍历单链表,判断节点值是否等于待查找值,相等则返回 true ,否则继续遍历下一个节点,直到遍历完整个链表还未找到,则返回 false
    19   this.search = function(element) {  // 查找节点
    20     let p = head
    21     if(!p) return false // 链表为null 直接返回false
    22     while(p) {  // 此时p为head首节点
    23       if(p.element === element) return true //如果相等直接返回 true
    24       p = p.next  // 把p赋值为下一节点
    25     }
    26     return false  // 遍历完了p最后等于null 表示没有直接返回false
    27   }
    28   // 思路:初始化一个节点(待追加节点),遍历到链尾,在尾节点后插入该节点
    29   this.append = function(element) {  // 追加节点
    30     // 初始化一个节点,然后定义p为头节点
    31     let node = new Node(element), p = head
    32     if(!head) { 
    33       head = node // 如果头节点为空那添加这个节点就是头节点
    34     } else {
    35       while(p.next) {// 头结点不为空遍历头节点
    36         p = p.next // 直到遍历最后一个节点为止,此时p为最后一个节点
    37       }
    38       p.next = node  // 此时p已经是最后一个节点,然后将next指向新最加的节点,这样最后一个节点就是新最加的节点node了其next为空
    39     }
    40     length += 1  // 到此length +1
    41   }
    42   // 思路:初始化一个节点(待插入节点 node ),遍历到 position 前一个位置节点,在该节点后插入 node
    43   this.insert = function(position, element) {// 特定位置插入节点
    44     // 首先创建插入节点
    45     let node = new Node(element)
    46     if(position >= 0 && position <= length ) {  // 小于0及超出边界的则直接返回null
    47       //定义上一节点,当前节点,当前索引等初始化值
    48       let prev = head, curr = head, index = 0
    49       if(position === 0) { // 边界情况 如果插入的是第0个则直接插入
    50         node.next = head
    51         head = node
    52       } else {
    53         while(index < position) {
    54           prev = curr  // 交换位置上一节点为当前节点
    55           curr = curr.next   // 当前节点为 下一节点
    56           index++  // 索引加1
    57         }
    58         // 当index等于position时
    59         prev.next = node // 上一节点的next就是插入节点
    60         node.next = curr // 插入节点替换了当前节点,插入节点的下一节点就是当前节点
    61       }
    62       length += 1 // 长度加1 (不管是在首节点还是其他位置插入节点长度+1)
    63     } else {
    64       return null
    65     }
    66   }
    67 
    68   this.remove = function(element) { // 删除节点
    69     if(!head) return  //边界情况如果链表为空直接返回
    70     let curr = head, prev = head
    71     while(curr) {
    72       if(curr.element === element) {  // 找到节点
    73         curr = curr.next  // 当前节点等于当前节点的next节点
    74         prev.next = curr // 上一节点的下节点等于当前节点
    75       } else { // 没有找到的时候
    76         prev = curr  // 交换位置上一节点等于当前节点
    77         curr = curr.next // 当前节点往后移等于next下一节点
    78       }
    79     }
    80   }
    81 
    82   this.isEmpty = function() {   // 节点是否为空
    83     return !head
    84   }
    85 
    86   this.size = function() { // 节点大小
    87     return length
    88   }
    89 }
  • 相关阅读:
    DNS正向反向解析
    varnish-4.0.5的反向代理 缓存测试 负载均衡实验
    DS8700 硬盘更换略
    ftp虚拟用户
    maven mvn 命令行 编译打包
    linux下的springboot项目启动文件
    linux系统安装gcc
    linux系统下安装两个或多个tomcat
    linux系统的磁盘挂载
    常用linux命令
  • 原文地址:https://www.cnblogs.com/leungUwah/p/12846624.html
Copyright © 2011-2022 走看看