数据结构与算法(js描述)-- 单链表

单链表

什么是单链表?

单链表是线性表中的链式存储结构,顾名思义,就是在内存中申请一小块地址空间的结点,该结点存放数据和指针,然后通过指针将这些结点连接成一条链,我们称之为单链表。

优点:便于插入和删除,插入和删除的时间复杂度均为O(1)
缺点:不便于查找,查找时只能遍历单链表,不能随机存取,而且由于存储指针导致内存密度<1

结点结构linkList
// 定义node结点
class LNode {
    constructor(data) {
        this.data = data;
        this.next = null;
    }
}
单链表结构及其操作
// 定义单链表结构
class LinkList {
    constructor(){
        this.data = null;
        this.next = null;
    }
    // 初始化单链表
    InitList_L() {
        this.next = null;
    }
    // 获取单链表的长度
    GetListLength() {
        let cur = this;
        let count = 0;
        while (cur.next !== null) {
            ++count;
            cur = cur.next;
        }
        return count;
    }
    // 建立带表头结点的单链表L(头插法)
    CreateList_L (arr) {
        for(let i = 0; i < arr.length; i++) {
            let p = new LNode(arr[i]);
            p.next = this.next;
            this.next = p;
        }
        return this;
    }
    // 在不带头结点的单链表中第pos个位置之前插入元素elem
    ListInsert_L (pos,elem) {
        let count = 0;
        let pre = this;
        // 遍历查找第pos-1个结点
        while (pre.next !== null && count < (pos - 1)) {
            ++count;
            pre = pre.next;
        }
        if(pre === null || count > (pos - 1)) return ERROR;
        // 创建新结点
        const p = new LNode(elem);
        p.next = pre.next;
        pre.next = p;
        return OK;
    }
    // 在不带头结点的单链表中,删除第pos个元素
    ListDelete_L (pos) {
        let pre = this;
        let count = 0;
        while (pre !== null && count < (pos - 1)) {
            ++count;
            pre = pre.next;
        }
        if(pre === null || count > (pos - 1)) return ERROR;
        pre.next = p.next;
        return OK;
    }
    // 归并单链表La,Lb
    MergeList_L (La,Lb) {
        // 已知单链表La和Lb的元素按值非递减排列
        let pa = La.next;
        let pb = Lb.next;
        let Lc = new LinkList();
        let pc = Lc.next;
        while (pa !== null && pb !== null) {
            if(pa.data <= pb.data) {
                pc.next = pa;
                pc = pa;
                pa = pa.next;
            } else {
                pc.next = pb;
                pc = pb;
                pb = pb.next;
            }
        }
        pc.next = pa !== null ? pa : pb;
        return Lc;
    }
}
简单测试
let testArr = ['JAMES','kOBE','Durant','Paul'];

// 创建单链表
const testList = new LinkList();
testList.CreateList_L(testArr);

// 遍历单链表
let p = testList;
while (p.next !== null) {
    p = p.next;
    console.log(p.data);
}
console.log(JSON.stringify(testList));
测试结果

linkListTestResult

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值