删除链表的倒数第n个节点
发布日期:2021-05-14 17:05:13 浏览次数:25 分类:精选文章

本文共 1551 字,大约阅读时间需要 5 分钟。

题目描述

给定一个链表,删除链表的倒数第n个节点并返回链表的头指针

解析

要解决这个问题,我们可以采取以下步骤:

  • 通过快速指针遍历链表的前n个节点,找到需要删除的节点所在的位置;
  • 遍历链表时,保持一个慢指针,从头开始一步步向前移动;
  • 当快速指针走到链表的末尾时,慢指针会正好停留在链表的倒数第n个节点处。
    通过这种方法,我们可以高效地删除所需的节点,确保链表的新头指针符合要求。
  • 代码解释(示例)

    import java.util.*;  public class Solution {      /**       * 删除链表的倒数第n个节点       * @param head 链表头节点       * @param n 倒数的位置数值       * @return 新的链表头节点       */      public ListNode removeNthFromEnd(ListNode head, int n) {          if (head == null || n <= 0) {              return head;          }          ListNode fast = head;          ListNode slow = head;          // 用快速指针找到第n个节点          for (int i = 0; i < n; i++) {              if (fast.next == null && i < n - 1) {                  // 当剩余节点不足以达到n时,直接返回原链表                  return head;              }              fast = fast.next;          }          // 当第一个指针到达末尾时,第二个指针正好位于倒数第n个节点          while (fast.next != null && slow.next != null) {              slow = slow.next;          }          // 分情况处理,当链表长度正好等于n时,返回null          if (slow.next == null && n <= slow.val) {              return null;          }          // 删除所需节点          if (slow.next.next == null || n == 1) {              slow.next = null;              return slow.next != null ? slow.next : head;          }          // 特殊情况处理,避免节点结构变化导致错误          if (slow.next == null) {              slow = slow.next;          }          slow.next = slow.next.next != null ? slow.next.next : null;          return head;      }  }

    优化效果

    该方法通过分步迭代,确保了链表删除操作的高效性,避免了递归带来的潜在栈溢出风险。代码逻辑清晰,注重边界条件的处理,可靠性强。通过这种方法,我们能够在O(n)的时间复杂度内完成任务,并保证链表结构的完整性。

    上一篇:通过jQuery实现计算器功能
    下一篇:二维数组的查找

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年05月11日 05时45分46秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章