剑指 offer 链表算法题:反转链表

题目描述: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

分析:

        原地反转,定义前驱节点,当前节点,遍历链表,然后缓存后驱节点,将当前节点链接到前驱节点,然后先更新前驱节点为当前节点,再更新当前节点为后驱节点,直到遍历结束返回前驱节点即可。

        递归,假设链表的其余部分已经被反转,现在是要反转前面的部分,则需要将当前节点的下一节点的next指针指向当前节点,然后将当前节点的next 置为null;

求解:

// 原地反转
function reverseList1<T extends number>(head: LinkNode<T> | null): LinkNode<T> | null {
  // 当前节点
  let currentNode = head;
  // 上一节点
  let prevNode: LinkNode<T> | null = null;
  while (currentNode !== null) {
    // 首先缓存下一节点
    const nextNode = currentNode.next;
    // 当前节点指向上一节点
    currentNode.next = prevNode;

    // 更新当前节点和上一节点, 直到当前节点变成 null, 上一节点即为尾节点
    prevNode = currentNode;
    currentNode = nextNode;
  }
  return prevNode;
}

// 递归
function reverseList2<T extends number>(head: LinkNode<T> | null): LinkNode<T> | null {
  if (head == null || head.next == null) {
    return head;
  }
  const newHead = reverseList2(head.next);
  head.next.next = head;
  head.next = null;
  return newHead;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值