数据结构复看--链表

链表:

首先我们要知道链表的结构以及每个节点的结构,这是我们手写链表的第一步,也是学习链表的第一步。我们知道,每个链表时这样表示的:

那每个节点结构是由数据域针域组成,数据域是存放数据的,而指针域存放下一结点的地址。

 

我们可以通过数据域访问到我们要的数据,而通过指针域访问到当前结点以后的结点,那么将这些结点串起来,就是一个链表。

2、定义节点

class Node{

  constructor(data){
        this.data = data;
        this.next = null;
   }
}

2.1、增加节点

2.1.1、咱们就以单链表中部添加数据为例子,分解成每个步骤,每个步骤对应代码如下:

1、保存临时地址(4结点的地址),需要进行遍历查找到3结点,也就是下列代码的currentNode 结点。

 

1//先查找该元素
2let currentNode = this.findByValue(element);
3// 保存 3 结点的下一结点地址(4 结点的地址)
4let pre = currentNode.next

 

2、创建新结点,将新结点(5结点)的指针指向下一结点指针(4结点地址,已经在上一步骤保存下来了)

 

1let newNode = new Node(value);
2newNode.next = pre;

 

3、3 的结点地址指向新结点(5结点)

 

1 currentNode.next = newNode;

 

以上步骤分析完毕,剩下的两个在头部插入和在尾部插入同样的分析方式,将这两个作为练习题,课下自己试一试这个步骤。

2.2 删除节点

删除节点也分为三种,头部、中部、尾部,咱们就删除中间结点为例进行删除,我们详细看步骤操作。

 

我们先看删除的全部动画,然后再分步拆分。

 

 

断开3结点的指针(断开3结点相当于让2结点直接指向4结点)

 1 let currentNode = this.head;
 2 // 用来记录 3 结点的前一结点
 3 let preNode = null;
 4 // 遍历查找 3 结点
 5 while(currentNode !== null && currentNode.data !== value){
 6        // 3 结点的前一结点
 7        preNode = currentNode;
 8        // 3 结点
 9        currentNode = currentNode.next;
10}

 

让结点2的指针指向4结点,完成删除。

 

1preNode.next = currentNode.next;

剩下的删除头结点和删除尾结点同样的步骤,自己动手尝试下。

所有代码实现:

 

/**
 * 2019/3/23
 * 公众号:「一个不甘平凡的码农」
 * @author 小鹿
 * 功能:单链表的插入、删除、查找
 * 【插入】:插入到指定元素后方
 * 1、查找该元素是否存在?
 * 2、没有找到返回 -1
 * 3、找到进行创建结点并插入链表。
 * 
 * 【查找】:按值查找/按索引查找
 * 1、判断当前结点是否等于null,且是否等于给定值?
 * 2、判断是否可以找到该值?
 * 3、没有找到返回 -1;
 * 4、找到该值返回结点;
 * 
 * 【删除】:按值删除
 * 1、判断是否找到该值?
 * 2、找到记录前结点,进行删除;
 * 3、找不到直接返回-1;
 */
//定义结点
class Node{
    constructor(data){
        this.data = data;
        this.next = null;
    }
}

//定义链表
class LinkList{
    constructor(){
        //初始化头结点
        this.head = new Node('head');
    }

    //根据 value 查找结点
    findByValue = (value) =>{
        let currentNode = this.head;
        while(currentNode !== null && currentNode.data !== value){
            currentNode = currentNode.next;
        }
       //判断该结点是否找到
        console.log(currentNode)
        return currentNode === null ? -1 : currentNode;
    }

    //根据 index 查找结点
    findByIndex = (index) =>{
        let pos = 0;
        let currentNode = this.head;
        while(currentNode !== null && pos !== index){
            currentNode = currentNode.next;
            pos++;
        }
        //判断是否找到该索引
       console.log(currentNode)
        return currentNode === null ? -1 : currentNode;
    }

    //插入元素(指定元素向后插入)
    insert = (value,element) =>{
       //先查找该元素
       let currentNode = this.findByValue(element);
        //如果没有找到
       if(currentNode == -1){
           console.log("未找到插入位置!")
           return;
       }
        let newNode = new Node(value);
        newNode.next = currentNode.next;
        currentNode.next = newNode;
    }

   //根据值删除结点
    delete = (value) =>{
        let currentNode = this.head;
        let preNode = null;
        while(currentNode !== null && currentNode.data !== value){
            preNode = currentNode;
            currentNode = currentNode.next;
        }
        if(currentNode == null) return -1; 
        preNode.next = currentNode.next;
    }

     //遍历所有结点
    print = () =>{
        let currentNode = this.head
        //如果结点不为空
        while(currentNode !== null){
            console.log(currentNode.data)
            currentNode = currentNode.next;
        }
    }
}

//测试
const list = new LinkList()
list.insert('xiao','head');
list.insert('lu','xiao');
list.insert('ni','head');
list.insert('hellow','head');
list.print()
console.log('-------------删除元素------------')
list.delete('ni')
list.delete('xiao')
list.print()
console.log('-------------按值查找------------')
list.findByValue('lu')
console.log('-------------按索引查找------------')
list.print()

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值