题目描述:

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:

  1. 给定一个链表: 1->2->3->4->5, n = 2.
  2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.

代码实现:

  • 常规方法,第一次遍历找到链表的长度,第二次删除对应节点。
  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} n
  11. * @return {ListNode}
  12. */
  13. var removeNthFromEnd = function(head, n) {
  14. var preHead = new ListNode(null)
  15. preHead.next = head
  16. var len = 0
  17. var first = head
  18. while (first) {
  19. len++
  20. first = first.next
  21. }
  22. len -= n
  23. first = preHead
  24. while (len != 0) {
  25. len--
  26. first = first.next
  27. }
  28. first.next = first.next.next
  29. return preHead.next
  30. };

删除链表中的倒数第N个节点 - 图1

  • 双指针法,很精妙的解法,快指针先跑n,之后快慢一起跑,快指针跑到最后时慢指针对应的就是删除的节点。
  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} n
  11. * @return {ListNode}
  12. */
  13. var removeNthFromEnd = function(head, n) {
  14. var preHead = new ListNode(null)
  15. preHead.next = head
  16. var fast = preHead
  17. var slow = preHead
  18. while (n != 0) {
  19. fast = fast.next
  20. n--
  21. }
  22. while (fast.next != null) {
  23. fast = fast.next
  24. slow = slow.next
  25. }
  26. slow.next = slow.next.next
  27. return preHead.next
  28. };

删除链表中的倒数第N个节点 - 图2