什么是链表


链表由多种元素组成,元素储存不连续,用 next 指针联系在一起;
数组:非首尾增删需要移动元素;
链表:只需要更改 next 指向即可;
JavaScript 没有链表,但可以使用 Object 模拟:**

const a = { name: 'zhangsan' }
const b = { name: 'lisi' }
const c = { name: 'wangwu' }
const d = { name: 'zhaoliu' }

模拟链表:

a.next = b
b.next = c
c.next = d

遍历

let pointer = a // 指针,初始化指向首个元素
while (pointer) {
  console.log(pointer.name) // zhangsan lisi wangwu zhaoliu
  pointer = pointer.next
}

插入

const c2 = { name: 'sunqi' }
c.next = c2
c2.next = d

删除

b.next = d

算法


删除一个元素:

const a = { val: 4 }
const b = { val: 5 }
const c = { val: 1 }
const d = { val: 9 }
a.next = b
b.next = c
c.next = d

步骤一:将当前元素的 val 设置为当前元素下一个元素的 val
步骤二:将当前元素的指针 next 指向当前元素后第二个元素

const deleteNode = function (node) {
  node.val = node.next.val
  node.next = node.next.next
}
deleteNode(b)

反转指针

const a = { val: 2 }
const b = { val: 4 }
const c = { val: 6 }
const d = { val: 8 }

a.next = b
b.next = c
c.next = d
d.next = null

步骤一:保存当前元素的下一位元素
步骤二:当前元素的指针指向上一位元素
步骤三:保存当前元素
步骤四:当前指针指向下一位元素

const reverseList = function (head) {
  let p1 = head // 当前指针
  let p2 = null // 当前元素上一个元素的指针
  while (p1) {
    const tmp = p1.next // 保存当前元素的下一位元素
    p1.next = p2 // 当前元素的指针指向上一位元素
    p2 = p1 // 保存当前元素
    p1 = tmp // 当前指针指向下一位元素
  }
  return p2
}
reverseList(a)
07-16 12:53