用JS实现单向链表

链表

链表是数据的一种存储结构,一个链表包含若干个节点,每个节点至少包含一个数据域和指针域,指针域指向下一个节点。第0个节点称为头节点,头节点中存放第一个节点的首地址,头节点中没有数据域不存放数据,只是一个指针变量,头节点之后的节点都包含两个域

  • 数据域 存放各种数据
  • 指针域 存放下一个节点的首地址
    在这里插入图片描述
    链表的分类
  • 单向链表
    每个节点都只有一个指向其下一个节点的指针域
  • 双向链表
    每个节点都有一个指向其前一个节点的指针域和指向其下一个节点的指针域
        // 定义节点类
            class Node{
                constructor(data){
                    this.data = data; //节点的数据域(数据成员)
                    this.next = null; //节点的指针域(指针成员)
                };
            };
        // 定义单向链表类
            class SingleLinked{
                constructor(){
                    this.size = 0; //记录链表中的节点个数
                    this.head = new Node('head'); //链表的头指针 记录链表的起使地址
                    this.currentNode = ''//用来记录当前节点
                };
                // 获取链表的长度
                getLength(){
                    return this.size;
                };

                // 判断链表是否为空
                isEmpty(){
                    return this.size === 0; 
                };

                // 遍历链表:不重复的访问链表每一个节点
                displayList(){
                    var list = '';
                    var currentNode = this.head; // 指向链表的头指针
                    while(currentNode);{// 若当前节点不为空 
                        list += currentNode.data;
                        currentNode = currentNode.next; // 让指针指向当前节点的下一个节点
                        if(currentNode){
                            list += '->';
                        };
                    };
                    console.log(list);
                };
                // 获取链表最后一个节点
                findLast(){
                    var currentNode = this.head; // 指向链表的头指针
                    while(currentNode.next){
                        currentNode = currentNode.next; // 指针指向当前节点的下一个节点
                    };
                    return currentNode;
                };
                //  采用尾插法给链表插入元素
                appendNode(element){
                    var currNode = this.findLast();// 找到链表的最后一个节点
                    var newNode = new Node(element);// 创建一个新的节点
                    currNode.next = newNode;
                    newNode.next = null;
                    this.size++; // 链表长度加一
                };
                // 查找节点
                findNode(element){
                    var currNode = this.head;
                    while(currNode && (currNode.data !== element)){
                        currNode = currNode.next;
                    };
                    return currNode;
                };
                // 删除节点
                removeNode(element){
                    if(!this.findNode(element)){
                        console.log('要删除的节点不存在!');
                        return;
                    };
                    if('head' === element){
                        console.log('整个链表被删除');
                    };
                };               
            };
            var slist = new SingleLinked();
            var arr = [4321,3221,1896,1288,4312,9824];
            for(var i=0;i<arr.length;i++){
                slist.appendNode(arr[i]);
            };
            slist.displayList();

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答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编写了一个单向链表的中间节点的代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值