[数据结构]单向链表 - pod4g/tool GitHub Wiki
/**
* 单向链表
* 由于在javascript中没有指针,所以可以用引用来模拟指针
*/
class Node {
constructor (data, next) {
this.data = data
this.next = next
}
}
/**
* 单向链表的整表创建
* @param {nunber} n 创建长度为n的链表
* @returns
* 头插入法
*/
function createSingleLinkedListByHeadInsert (n) {
let i
// 生成头节点
let head = new Node()
for (i = 0; i < n; i++) {
let node = new Node(i)
node.next = head.next
head.next = node
}
return head
}
/**
* 单向链表的整表创建
* @param {nunber} n 创建长度为n的链表
* @returns
* 尾插入法
*/
function createSingleLinkedListByTailInsert (n) {
let i
// 生成头节点
let head = new Node()
// 尾节点
let tail = head
for (i = 0; i < n; i++) {
// 生成一个新节点
let node = new Node(i)
// 尾节点的next指向这个新节点
tail.next = node
// 更新当前的尾节点为这个新节点
tail = node
}
return head
}
let linkedList = createSingleLinkedListByHeadInsert(10)
let linkedList2 = createSingleLinkedListByTailInsert(10)
// console.log(JSON.stringify(linkedList))
// console.log(JSON.stringify(linkedList2))
/**
* @param {object} linkedList
* @param {number} 单向链表的第i个元素
* 找到单向链表的第i个元素,并把其值返回
*/
function getElem (linkedList, i) {
let j = 1
let p = linkedList.next
while (p && j < i) {
p = p.next
++j
}
if (!p || j > i) {
return null
}
return p.data
}
let val = getElem(linkedList, 9)
// console.log(val)
/**
* @param {object} linkedList
* @param {number} i
* @param {any} val
* @returns 在单向链表第i个元素之前,插入一个新节点,数据为val
*/
function linkedListInsert (linkedList, i, val) {
let j = 1
let p = linkedList.next
// 找到第i-1个元素,此元素即为第i个元素之前的元素
while (p && j < i - 1) {
p = p.next
++j
}
if (!p || j > i - 1) {
return linkedList
}
// 新建一个节点,值为val
let node = new Node(val)
node.next = p.next.next
p.next = node
return linkedList
}
console.log(JSON.stringify(linkedListInsert(linkedList2, 5, 999)))
/**
* @param {object} linkedList
* @param {number} i
* @returns 返回被删除的值
*/
function linkedListDelete (linkedList, i) {
let j = 1
let p = linkedList.next
while (p && j < i - 1) {
p = p.next
++j
}
if (!p && j > i - 1) return null
let q = p.next
let val = q.data
p.next = q.next
q = null
return val
}
/**
* @param {object} linkedList
* 删除指定的单链表
*/
function linkedListClear (linkedList) {
let p, q
p = linkedList.next
while (p) {
q = p.next
p = null
p = q
}
p = null
}
console.log(JSON.stringify(linkedListClear(linkedList2)))
linkedListClear(linkedList2)