第一种方法是使用前后指针,前指针先向前走n+1步,然后前后指针同时向前,当前指针指向NULL时,后指针正好指向需要删除的节点的前一个节点,操作后指针删除即可。
代码如下:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode * dummyhead = new ListNode(0);dummyhead->next = head;ListNode * fast = dummyhead;ListNode * slow = dummyhead;while(n--){fast = fast->next;}fast = fast->next;while(fast != NULL){slow = slow->next;fast = fast->next;}ListNode * tmp = slow->next;slow->next = slow->next->next;delete tmp;head = dummyhead->next;return head;}
};
第二种解法时使用递归,每次递归则用一个k进行计数,当k与n相等时,跳过这个节点,不进行返回。代码如下:
class Solution {
public:int k=0;ListNode* removeNthFromEnd(ListNode* head, int n) {if(head==nullptr)return nullptr;head->next = removeNthFromEnd(head->next,n);k++;if(k==n)return head->next;return head;}
};