19. 删除链表的倒数第 N 个结点

链表的长度

用到哑节点
遍历到 L−n+1 个节点时,它的下一个节点就是我们需要删除的节点,只需要修改一次指针,就能完成删除操作。

  1. class Solution {
  2. public ListNode removeNthFromEnd(ListNode head, int n) {
  3. ListNode dummy = new ListNode(0, head);
  4. int length = getLength(head);
  5. ListNode cur = dummy;
  6. for (int i = 1; i < length - n + 1; ++i) {
  7. cur = cur.next;//知道要删除的节点的前一个
  8. }
  9. cur.next = cur.next.next;
  10. ListNode ans = dummy.next;//保留最开始位置
  11. return ans;
  12. }
  13. public int getLength(ListNode head) {
  14. int length = 0;
  15. while (head != null) {
  16. ++length;
  17. head = head.next;
  18. }
  19. return length;
  20. }
  21. }

双指针、

  1. class Solution {
  2. public ListNode removeNthFromEnd(ListNode head, int n) {
  3. ListNode dummy = new ListNode(0, head);
  4. ListNode first = head;//双指针错开一个位置.
  5. ListNode second = dummy;//
  6. for (int i = 0; i < n; ++i) {
  7. first = first.next;
  8. }
  9. while (first != null) {//退出循环时first指向null.
  10. first = first.next;
  11. second = second.next;
  12. }
  13. second.next = second.next.next;
  14. ListNode ans = dummy.next;
  15. return ans;
  16. }
  17. }