四、链表
1、名词解释:链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。
2、链表功能:
- 添加节点:addNode()
- 移除节点:remove()
- 插入节点:insert()
- 将链表变成字符串:toString()
- 判断链表是否存在节点:isEmpty()
- 返回链表长度:size()
- 返回链表:getHead()
3、单项链表基本框架:
function lb() { function node(elem) { this.element = elem; this.next = null; } let head = null, cur, par; let length = 0; }
- 添加节点:如果链表为空,添加到head节点下,否则添加到最后的节点下。
this.addNode = function (elem) { let n = new node(elem), cur; if (head === null) { head = n; } else { cur = head; while (cur.next) { cur = cur.next; } cur.next = n; } length++; }
- 移除节点:判断传入的是链表的下标位置,还是元素的内容。默认以下标查找元素。
this.remove = function (ele, isNum) { let iN = isNum == false ? false : true; cur = head; if (iN) { //isNum let i = 0; if (ele > -1 && ele < length) { if (ele === 0) { head = cur.next; } else { while (i++ < ele) { par = cur; cur = cur.next; } par.next = cur.next; } } else { return null; } } else { //no is Num while (cur.element != ele) { par = cur; cur = cur.next; } par.next = cur.next; } length--; return cur.element; }
- 插入节点:判断传入的是链表的下标位置,还是元素的内容。默认以下标查找元素。
this.insert = function (position, element, isIndex) { let iI = isIndex == false ? false : true; var n = new node(element); let index = 0; cur = head; if (iI) { //position is index if (position == 0) { n.next = cur; head = n; } else if (position == length) { while (cur.next) { cur = cur.next; } cur.next = n; } else { for (let i = 0; i < position; i++) { par = cur; cur = cur.next; } n.next = cur; par.next = n; } length++; } else { //position ist index for (let i = 0; i < length; i++) { if (cur.element == position) { par = cur; cur = cur.next; break; } else { cur = cur.next } } if (par) { n.next = cur par.next = n length++; } else { console.log('链表中不存在您选择的元素') } } }
- 将链表变成字符串输出:
this.toString = function () { let cur = head, str = ''; while (cur) { str += cur.element + (cur.next ? ' next,' : ' null') cur = cur.next } return str }
- 判断链表的内容是否为空:
this.isEmpty = function () { return length === 0; }
- 显示链表的长度:
this.size = function () { return length; }
- 获取链表的内容:
this.getHead = function () { return head; }
4、双向链表:链接是双向的:一个链向下一个元素,另一个链向前一个元
- 基本框架:
-
function Doublelb() { function node(elem) { this.element = elem; this.next = null; this.prev = null; } let head = null, cur, par; let length = 0; let tail = null; }
- 添加节点:
this.addNode = function (elem) { let n = new node(elem), cur; if (head === null) { n.prev = 'head'; head = n; } else { cur = head; while (cur.next) { cur = cur.next; } cur.next = n; while (cur.prev){ par = cur.element; cur = cur.next; } cur.prev = par; } length++; }
- 移除节点:
this.remove = function (ele, isNum) { let iN = isNum == false ? false : true; cur = head; if (iN) { //isNum let i = 0; if (ele > -1 && ele < length) { if (ele === 0) { head = cur.next; } else { while (i++ < ele) { par = cur; cur = cur.next; } par.next = cur.next; cur.next.prev = par.element; } } else { return null; } } else { //no is Num while (cur.element != ele) { par = cur; cur = cur.next; } par.next = cur.next; cur.next.prev = par.element; } length--; return cur.element; }
- 插入节点
this.insert = function (position, element, isIndex) { let iI = isIndex == false ? false : true; var n = new node(element); let index = 0; cur = head; if (iI) { //position is index if (position == 0) { cur.prev = n.element; n.next = cur; n.prev = 'head'; head = n; } else if (position == length) { while (cur.next) { cur = cur.next; } n.prev = cur.element; cur.next = n; } else { for (let i = 0; i < position; i++) { par = cur; cur = cur.next; } cur.prev = n.element; n.next = cur; n.prev = par.element; par.next = n; } length++; } else { //position ist index for (let i = 0; i < length; i++) { if (cur.element == position) { par = cur; cur = cur.next; break; } else { cur = cur.next; } } if (par) { cur.prev = n.element; n.next = cur; n.prev = par.element; par.next = n; length++; } else { console.log('链表中不存在您选择的元素') } } }
5、单项循环列表
- 添加元素
this.addNode = function (elem) { let n = new node(elem), cur; if (head === null) { head = n; } else { cur = head; while (cur.next && cur.next != head.element) { cur = cur.next; } cur.next = n; while (cur.next) { cur = cur.next; } cur.next = head.element; } length++; }
- 移除元素
this.remove = function (ele, isNum) { let iN = isNum == false ? false : true; cur = head; if (iN) { //isNum let i = 0; if (ele > -1 && ele < length) { if (ele === 0) { head = cur.next; } else { while (i++ < ele) { par = cur; cur = cur.next; } par.next = cur.next; } } else { return null; } } else { //no is Num while (cur.element != ele) { par = cur; cur = cur.next; } par.next = cur.next; } length--; return cur.element; }
- 插入元素
this.insert = function (position, element, isIndex) { let iI = isIndex == false ? false : true; var n = new node(element); let index = 0; cur = head; console.log(length) if (iI) { //position is index if (position == 0) { n.next = cur; head = n; } else if (position == length) { while (cur.next&&cur.next!=head.element) { cur = cur.next; } n.next = head.element; cur.next = n; } else if (position > 0 && position < length) { for (let i = 0; i < position; i++) { par = cur; cur = cur.next; } n.next = cur; par.next = n; }else{ console.log('链表中不存在您选择的元素') } length++; } else { //position ist index for (let i = 0; i < length; i++) { if (cur.element == position) { par = cur; cur = cur.next; break; } else { cur = cur.next } } if (par) { n.next = cur par.next = n length++; } else { console.log('链表中不存在您选择的元素') } } }
6、双向循环列表
- 添加元素
this.addNode = function (elem) { let n = new node(elem), cur; if (head === null) { n.prev = 'head'; head = n; } else { cur = head; cur.prev = n.element; n.next = head.element; while(cur.next!=head.element&&cur.next){ cur = cur.next; } cur.next = n; while (cur.prev) { par = cur.element; cur = cur.next; } cur.prev = par; } length++; }
- 移除元素
this.remove = function (ele, isNum) { let iN = isNum == false ? false : true; cur = head; if (iN) { //isNum let i = 0; if (ele > -1 && ele < length) { if (ele === 0) { head = cur.next; } else { while (i++ < ele) { par = cur; cur = cur.next; } par.next = cur.next; cur.next.prev = par.element; } } else { return null; } } else { //no is Num while (cur.element != ele) { par = cur; cur = cur.next; } par.next = cur.next; cur.next.prev = par.element; } length--; return cur.element; }
- 插入元素
this.insert = function (position, element, isIndex) { let iI = isIndex == false ? false : true; var n = new node(element); let index = 0; cur = head; if (iI) { //position is index while(cur.next!=head.element&&cur.next){ cur = cur.next; } cur = head; if (position == 0) { cur.next = n.element; cur.prev = n.element; n.next = cur; n.prev = 'head'; head = n; } else if (position == length) { while (cur.next) { cur = cur.next; } n.prev = cur.element; cur.next = n; } else { for (let i = 0; i < position; i++) { par = cur; cur = cur.next; } cur.prev = n.element; n.next = cur; n.prev = par.element; par.next = n; } length++; } else { //position ist index for (let i = 0; i < length; i++) { if (cur.element == position) { par = cur; cur = cur.next; break; } else { cur = cur.next; } } if (par) { cur.prev = n.element; n.next = cur; n.prev = par.element; par.next = n; length++; } else { console.log('链表中不存在您选择的元素') } } }

浙公网安备 33010602011771号