
删除链表的倒数第n个节点
通过快速指针遍历链表的前n个节点,找到需要删除的节点所在的位置; 遍历链表时,保持一个慢指针,从头开始一步步向前移动; 当快速指针走到链表的末尾时,慢指针会正好停留在链表的倒数第n个节点处。通过这种方法,我们可以高效地删除所需的节点,确保链表的新头指针符合要求。
发布日期:2021-05-14 17:05:13
浏览次数:25
分类:精选文章
本文共 1551 字,大约阅读时间需要 5 分钟。
题目描述
给定一个链表,删除链表的倒数第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)的时间复杂度内完成任务,并保证链表结构的完整性。