✨题目

给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点
image.png

✨样例

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]

输入:head = [1], n = 1 输出:[]

✨解题

由于是单链表,造成删除倒数第 n 个节点不好做,所以不妨转换成删除正数的节点,用两个指针去遍历,pre指针总是记录当前节点的前一个节点,最后只需要对删除头节点的情况进行特殊处理一下即可。

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* removeNthFromEnd(ListNode* head, int n) {
  14. if(head->next == NULL && n == 1){
  15. return NULL;
  16. }
  17. ListNode* node = head;
  18. int sum = 0;
  19. while(node != NULL){
  20. sum ++;
  21. node = node->next;
  22. }
  23. node = head;
  24. ListNode* preNode = head;
  25. int m = sum - n;
  26. while(m > 0){
  27. preNode = node;
  28. node = node->next;
  29. m--;
  30. }
  31. preNode->next = node->next;
  32. if(preNode == head && preNode == node){
  33. return head->next;
  34. }
  35. delete node;
  36. return head;
  37. }
  38. };