题目链接

思路

使用两个节点,一个指向头节点,一个指向新节点,新节点指向头节点。俩节点不断拉开距离直到为n,然后一起前进,直到终点。此时后方的节点正好指向要被删除的节点的前面。删除时单独处理一下头节点即可。

代码

  1. class Solution {
  2. fun removeNthFromEnd(head: ListNode?, n: Int): ListNode? {
  3. var distance = 1
  4. var firstNode = head
  5. var secondNode = ListNode(0)
  6. secondNode.next = head
  7. while (firstNode?.next != null) {
  8. if (distance < n) {
  9. firstNode = firstNode.next
  10. distance++
  11. }else {
  12. firstNode = firstNode.next
  13. secondNode = secondNode.next!!
  14. }
  15. }
  16. return if (secondNode.next == head) {
  17. head?.next
  18. }else {
  19. secondNode?.next = secondNode?.next?.next
  20. head
  21. }
  22. }
  23. }