这题主要考察的是链表和双指针的使用。
思路:
- 首先我们想到的是,删除倒数第n个节点,有一种简单的办法是先遍历一遍链表,然后获取链表的长度,再减去删除节点的长度得到我们需要的长度,然后进行删除。
- 其实可以不需要遍历一遍链表,我们可以定义一个快慢指针,快指针先走到要删除的节点个数,慢指针从头开始删除然后遍历链表,当快指针结束的时候,慢指针就到达了要删除的节点的前一个节点,删除即可
- 需要注意的是如果删除的节点是链表的头节点的话,可能无法删除,所以说可以定义一个元指针,然后指向链表。
/** * @author xienl * @description 删除链表的倒数第n个节点 * @date 2022/6/30 */ public class Solution { public static void main(String[] args) { Solution solution = new Solution(); } /** * 使用双指针的方式,快慢指针解决 * @param head * @param n * @return */ public ListNode removeNthFromEnd (ListNode head, int n) { // write code here ListNode dummy = new ListNode(-1); dummy.next = head; ListNode cur = dummy; ListNode fast = dummy; for (int i = 0; i < n; i++){ fast = fast.next; } while (fast != null){ fast = fast.next; cur = cur.next; } // 定位需要删除节点的前一个节点,然后进行删除 cur.next = cur.next.next; return dummy.next; } } class ListNode { int val; ListNode next = null; public ListNode(int val) { this.val = val; } }