跳至主要內容

反转链表

微信公众号:储凡2023/2/11小于 1 分钟

反转链表

题目链接

题目描述

刷题思路

代码实现

/*
 * @Description: 【中等】反转链表
 * @Version: Beta1.0
 * @Author: 微信公众号:储凡
 * @Date: 2021-05-02 16:13:46
 * @LastEditors: 微信公众号:储凡
 * @LastEditTime: 2021-05-02 16:36:52
 */

export function ListNode(x) {
  this.val = x
  this.next = null
}

// 头插法
export function ReverseList(pHead) {
  // 定义反转后链表
  let result = null
  //     let result=new ListNode(-1)
  // 使用头插法
  while (pHead) {
    const currentNode = pHead
    pHead = pHead.next
    // 当前结点的后继结点为修改前的反转后的链表
    currentNode.next = result
    // 翻转的链表的头结点指向头插法插入的结点
    result = currentNode
  }
  return result
}

/**
 * 递归
 */
export function ReverseList01(pHead) {
  if (pHead === null || pHead.next === null) {
    return pHead
  }

  // head为当前链表的头结点
  // 定义当前链表头结点的后继结点 【前提是前面判断其后继结点存在】
  const nextNode = pHead.next

  // 此时将链表分为头结点+ 后继结点为头结点的子链表
  // 对子链表进行反转,得到新的链表【这里是递归,先考虑一层,考虑其他容易乱】
  const result = ReverseList01(nextNode)
  // 在反转链表的result中,原来是head后继结点当头结点的nextNode,现在是result链表的尾结点
  // 对原来的pHead的后继结点置null 此时的head应该为result的尾结点,避免递归陷入死循环
  pHead.next = null
  // 只需要将result的尾结点与head链接起来,就是反转链表了
  nextNode.next = pHead

  return result
}

一些建议

更新日志

2024/7/28 10:06
查看所有更新日志
  • c0f2d-refactor: 升级vuepress相关版本,优化项目结构 (#137)
  • 06596-feat: 算法相关文档新增固定链接,优化导入代码配置
  • 9b9e4-feat: 算法相关文档更新,删除讨论链接 (#88)
  • b0275-feat(markdownlint-cli): 添加markdown文档校验,支持lint脚本自动格式化文档
  • 5f1e1-feat: 导航栏、侧边栏内容修改,新增目录对应的文档
  • 02ab1-style: 文档目录调整,修改mdEnhance配置
  • 8de1a-feat: 剑指算法文档更新,修改目录结构
  • d0347-docs(algorithm): 新增模版格式
  • 74e84-docs(algorithm): 新增一些文档
  • ced18-docs: 更新一些文档,优化导航栏
  • a23ce-refactor: 新增manuscript目录,优化文稿结构
  • e34c0-style(code): 代码风格eslint格式化,新增部分文档
  • 74aa9-docs(algorithm): 新增一些文档
  • 3c22c-refactor: 新增Eslint配置,修改相关代码风格
  • 9bbe9-feat: 修改导航栏结构,添加文档
  • e4c74-feat: 新增算法源码
贡献者: chu fan,Chu Fan,chufan,142vip.cn,chufan443