js实现单向链表

先po一张单向链表的图。单向链表就是最基础的链表啦~
在这里插入图片描述
下面是如何用js实现一个链表。
定义一个链表的节点对象Node:

class Node{
      constructor(ele){
        this.element = ele
        this.next = null
      }
    }

定义一个链表对象LinkList,该对象包含的属性:head(头指针)、length(链表长度),方法有append(增加节点)、deleteNode(删除某一位置的节点)、insertNode(在某个位置插入节点)。

class LinkList {

      length = 0; //链表的长度
      head = null //头指针

      append(ele){ //增加节点
        let node = new Node(ele)
        let current
        if(this.head == null){
          this.head = node
        }else{
          current = this.head
          while(current.next){
            current = current.next
          }
          current.next = node
        }
        this.length ++
      }
    
      deleteNode(pos){ //删除某个下标处的节点
        let current = this.head
        if(this.head == null){
          console.log("链表为空,无法删除")
          return ;
        }else if(pos+1 > this.length){
          console.log("下标大于链表长度,无法删除")
        }else{
          let pre
          let i = 0
          current = this.head
          //若pos为0,即删除第一个位置的元素,需要让head指向第二个节点,不为零则往下查找
          if(pos){
            while(i < pos){
              pre = current
              current = current.next  
              i++
            }
            pre.next = current.next
          }else{
            this.head = current.next
          }
          this.length --
        }
      }

      insertNode(pos,ele){ //在某个位置插入节点
        let newNode = new Node(ele)
        let current = this.head
        let pre
        if(pos>this.length){
          console.log("下标大于链表长度,无法添加")
        }
        else{
          let i = 0
          //若pos为0,即在第一个位置插入,需要让head指向新节点,不为零则往下查找
          if(pos){ 
            while(i<pos){
              pre = current
              current = current.next
              i++
            }
            pre.next = newNode
            newNode.next = current
          }else{
            newNode.next = this.head
            this.head = newNode
          }
          this.length ++
        }
      }
    }

链表插入节点原理:先让当前节点的前一个结点指向新节点,再让新节点的next指向当前节点。
插入节点原理
链表删除节点原理:让当前节点的前一个节点的next指向当前节点的next,当前节点置为空或做一些其他处理(根据你的需求来定啦)
在这里插入图片描述
这些代码测试过了应该是没问题的。本人现在还是一个前端小菜鸡,若有不对的地方请多多指正😀

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: var middleNode = function (head) { var slow = head; var fast = head; while (fast.next && fast.next.next) { slow = slow.next; fast = fast.next.next; } return slow; } ### 回答2: 要写一个JS代码来找到一个单向链表的中间节点,可以使用快慢指针的方法来解决。快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表尾部时,慢指针所在的位置就是中间节点。 下面是一个示例的代码实现: ```javascript function findMiddleNode(head) { let slow = head; let fast = head; while (fast && fast.next) { slow = slow.next; fast = fast.next.next; } return slow; } ``` 以上代码中,我们使用两个指针`slow`和`fast`初始化为链表的头节点。在每次循环中,`slow`指针向后移动一个节点,`fast`指针向后移动两个节点。当`fast`指针到达链表尾部时,`slow`指针正好处于链表的中间位置。 最后,返回`slow`指针所在的节点,即为链表的中间节点。 以上代码的时间复杂度为O(n/2),其中n为链表的长度。 ### 回答3: 首先,我们需要定义一个链表节点的类。每个节点包含一个值和一个指向下一个节点的指针。代码如下: ```javascript class Node { constructor(value) { this.value = value; this.next = null; } } ``` 然后,我们创建一个单向链表类,其中包含几个方法。其中一个方法是用于添加节点的`addNode`方法。我们还需要两个指针来追踪链表的头部和中间节点。代码如下: ```javascript class LinkedList { constructor() { this.head = null; this.mid = null; } addNode(value) { const newNode = new Node(value); if (!this.head) { this.head = newNode; this.mid = newNode; } else { this.mid.next = newNode; this.mid = newNode; } } } ``` 接下来,我们需要编写一个方法来查找链表的中间节点。由于单向链表只能从头部向下遍历,我们可以使用两个指针的方法来实现。一个指针,我们称之为'快指针',将每次移动两个节点,而另一个指针,我们称之为'慢指针',将每次移动一个节点。当快指针到达链表的末尾时,慢指针将指向中间节点。最后,我们将中间节点返回。代码如下: ```javascript findMiddleNode() { let slow = this.head; let fast = this.head; while (fast && fast.next) { slow = slow.next; fast = fast.next.next; } return slow; } } ``` 这样,我们就可以使用上述代码创建一个单向链表,并找到其中间节点。以下是一个示例: ```javascript const linkedList = new LinkedList(); linkedList.addNode(1); linkedList.addNode(2); linkedList.addNode(3); linkedList.addNode(4); linkedList.addNode(5); const midNode = linkedList.findMiddleNode(); console.log(midNode.value); // 输出3 ``` 这样,我们就成功地使用JavaScript编写了一个单向链表的中间节点的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值