LC19题——删除链表中倒数第n个元素

题目难度:简单

Posted by 谢玄xx on March 3, 2022

解法1

解题思路

常见的链表操作为——添加一个哑节点(dummy node) 这个dummy的next指针指向head.如此我们就不需要对头节点进行其他操作了。 但请注意,程序写完一定要delete掉

代码如下:

#include <iostream>
using namespace std;
struct ListNode
{
  int val;
  ListNode* next;
  ListNode(int x): val(x), next(NULL){}
};
int getLength(ListNode* head, int n)
{
  int length;
  for(int i = 0; i < n; i++)
  {
    ++length;
    head = head->next;
  }
  return length;
}

ListNode* removeNthNode(ListNode* head, int n)
{
  ListNode* dummy = new ListNode(0,head);
  int length = getLength(head);
  ListNode* cur = dummy;
  for(int i = 0; i < length - n + 1; i++)
  {
    cur = cur->next;
  }
  cur->next = cur->next->next;
  ListNode* ans = dummy->next;
  delete dummy;
  return ans;
}
int main()
{
    //缺测试用例
}

解法2

解题思路

代码如下:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummy = new ListNode(0);
        ListNode *left = dummy;
        ListNode *right = dummy;//new两个指针,都指向这个虚拟的头结点
        dummy->next = head; //让这个虚拟的头结点指向真正的头结点
        //先让快指针向前走n步
        for(int i = 0; i < n; i++)
        {
            right = right->next;
        }
        //当快指针不是最后一个节点的时候,就让快慢指针同时向后移动
        while(right->next)
        {
            left = left->next;
            right = right->next;
        }
        //当快指针是最后一个节点的时候,就把慢指针后面一个节点删除
        left->next = left->next->next;
        return dummy->next;


    }
};
int main()
{
    //缺测试用例
}