前端面试真题,2周刷完100道 5. 用js 反转单向链表

71 阅读1分钟

链表是什么

链表和数组的区别

  1. 数组

需要连续的内存空间,从中间或者开头插入删除的操作比较费时 方便利用index 查找

  1. 链表

零散的内存空间,修改顺序只需要改变指针的指向

链表的样子

lianbiao.jpg

A,B,C 等是链表上的元素值,next 是该节点的指针, 指向下一个节点。prev 指向上一个节点。 如果没有下一个节点或者上一个节点就没有对应的指针

创建一个单向链表

interface MlinkNode {
  value : number
  next ?: MlinkNode
}

function creatLinkNode (list: number[]):MlinkNode {
  if (list.length ===0) {
    throw new Error('数组为空')
  }
  let length = list.length;
  let curNode: MlinkNode = {
    value : list[length-1]
  }
  if (length > 1) {
    for (let i = length-2; i>=0; i--) {
      curNode = {
        value: list[i],
        next: curNode
      }
    }
  }
  return curNode
}

反转链表

  • 思路

lianbiao2.jpg

  • 代码实现
function reverseLinkNode(listNode: MlinkNode) :MlinkNode {
  let curNode : MlinkNode | undefined = undefined
  let nextNode: MlinkNode | undefined = listNode
  let prevNode: MlinkNode | undefined = undefined
  while (nextNode) {
    // 删掉第一个元素的 next 防止循环
    if (curNode && !prevNode) {
      // @ts-ignore
      delete curNode.next
    }
    // 反转指针
    if (curNode && nextNode) {
      curNode.next = prevNode
    }
    // 往后移动
    prevNode = curNode
    curNode = nextNode
    nextNode = nextNode?.next
  }
  curNode!.next = prevNode
  return curNode!
}

2周刷完100道前端优质面试真题 mu课 视频及资料领取请关注: 奋斗的刚子

欢迎访问我的小程序,惊喜不断啊

xcxm.jpg