前端算法总结(三)—链表实现

一、链表

1、链表实现

    function List(value){
      this.value = value;
      this.next = null;
    }//构造函数
    const Node1 = new List(1);
    const Node2 = new List(3);
    const Node3 = new List(5);
    Node1.next = Node2;
    Node2.next = Node3;
    console.log(Node1);

在这里插入图片描述

2、链表遍历

//第一种方法
function print(root){
  let temp = root;
  while(temp){//节点存在
    console.log(temp.value);//输出值
    temp = temp.next;//下一个节点
  }
}

在这里插入图片描述

//第二种方法
function print(root){
  //分治法
  if(root){//存在root
    console.log(root.value);//输出值
    print(root.next);//下个节点
  }
}

在这里插入图片描述

3、链表长度

function getLength(root){
  if(!root){//不存在,找到出口
    return 0;
  }
  return 1 + getLength(root.next);//否则相加
}

在这里插入图片描述

4、链表节点查询

//第一种方法
function getNode(root,index){
  let _index = 0,temp = root;
  while(temp){//遍历链表
    if(_index == index){//如果索引相等,找到
      return temp;
    }else{//否则,索引+1,下一个节点
      _index ++;//最后为null时会多+1
      temp = temp.next;
    }
  }
  if(index > _index - 1 || index < 0){
    return false;
  }
}

在这里插入图片描述

//第二种方法
function getNode(root,index){
  function _getNode(temp,_index){
    if(_index == index){
      return temp;
    }else if(!temp){
      return false;
    }
    return _getNode(temp.next,_index+1)
  }
  return _getNode(root,0)
}

在这里插入图片描述

5、设置链表节点值

只需要对上面节点查询方法进行修改即可

//第一种方法
function setValue(root,index,value){
  let _index = 0,temp = root;
  while(temp){
    if(_index == index){
      temp.value = value;
      return;
    }else{
      _index ++;
      temp = temp.next;
    }
  }
  if(index > _index - 1 || index < 0){
    return false;
  }
}
setValue(Node1,1,2);

在这里插入图片描述

//第二种方法
function setValue(root,index,value){
  function _setValue(temp,_index){
    if(_index == index){
      temp.value = value;
    }else if(!temp){
      return false;
    }
    return _setValue(temp.next,_index+1)
  }
  _setValue(root,0);
}
setValue(Node1,1,2);

在这里插入图片描述

6、链表插入节点

//第一种方法
function addNode(root,index,value){
  let _index = 0,temp = root;
  while(temp){
    if(_index == index-1){
      let newNode = new List(value);
      newNode.next = temp.next;
      temp.next = newNode;
      return;
    }else{
      _index ++;
      temp = temp.next;
    }
  }
  if(index > _index - 1 || index < 0){
    return false;
  }
}

在这里插入图片描述

//第二种方法
function addNode(root,index,value){
  function _addNode(temp,_index){
    if(!node){
      return false;
    }
    if(_index == index-1){
      let newNode = new List(value);
      newNode.next = temp.next;
      temp.next = newNode;
    }else{
      _addNode(temp.next,_index+1)
    }
  }
  _addNode(root,0)
}

7、链表尾部插入

function append(root,value){
  while(root){
    if(!root.next){
      let newNode = new List(value);
      root.next = newNode;
      return;
    }else{
      root = root.next;
    }
  }
}

8、删除链表结点

//第一种方法
function remove(root,index){
  let _index = 0,temp = root;
  while(temp){
    if(_index == index-1){
      temp.next = temp.next.next
      return;
    }else{
      _index ++;
      temp = temp.next;
    }
  }
  return false;
}

在这里插入图片描述

//第二种方法
function remove(root,index){
  function _remove(temp,_index){
    if(!temp || !temp.next){
      return false;
    }
    if(_index == index-1){
      temp.next = temp.next.next;
    }else{
      _remove(temp.next,_index+1);
    }
  }
  _remove(root,0);
}

在这里插入图片描述

9、链表倒序

function reverse(root){
  //没有或一个节点
  if(!root || !root.next){
    return root;
  }
  //两个节点
  if(!root.next.next){
    let temp = root.next;
    temp.next = root;
    root.next = null;
    return temp;
  }
  //超过两个
  if(root.next.next){
    let temp = reverse(root.next);//后面的先解决
    root.next.next = root;//将最先两个倒序即可
    root.next = null;
    return temp;
  }
}

在这里插入图片描述
博主开始运营自己的公众号啦,感兴趣的可以关注“飞羽逐星”微信公众号哦,拿起手机就能阅读感兴趣的文章啦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞羽逐星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值