LeetCode刷题笔记—双指针题型集锦(19. 删除链表的倒数第 N 个结点)
19. 删除链表的倒数第 N 个结点(难度:中等)
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2: 输入:head = [1], n = 1 输出:[] 示例 3: 输入:head = [1,2], n = 1 输出:[1] 提示: 链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz

第一种方法:暴力解法
先遍历一遍链表,得到链表的长度length,然后再从头遍历length - n + 1的节点就是删除的节点
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(0,head); int length = getLength(head); ListNode cur = dummy; for(int i = 0;i<length - n + 1;++i){ cur = cur.next; } cur.next = cur.next.next; ListNode ans = dummy.next; return ans; } public int getLength(ListNode head){ int length = 0; while(head != null){ head = head.next; ++length; } return length; } }
第二种方法:双指针
定义两个指针,一个快指针,一个慢指针,都从第一个节点开始遍历,让快指针比慢指针快n个节点,当快指针到末尾时,慢指针则刚好指向待删除的节点,我们引入一个哑节点,让慢指针指向哑节点,使得慢指针停在待删除节点的前驱节点,如果没有哑节点,若演示实例是head = [1],n = 1,这是slow指向head,slow.next = slow.next.next就会报错。
动画演示:(黄色方块即为哑节点)
演示动画来自:动画图解 LeetCode 第 19 号问题:删除链表的倒数第 N 个节点 - 删除链表的倒数第 N 个结点 - 力扣(LeetCode) (leetcode-cn.com)
代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(0,head); ListNode slow = dummy,fast = head; for(int i = 0;i<n;i++){ fast = fast.next; } while(fast!= null){ fast = fast.next; slow = slow.next; } slow.next = slow.next.next; ListNode ans = dummy.next; return ans; } }

浙公网安备 33010602011771号