两种方法:
1 使用一个指针遍历两次
第一次用于算出来倒数第N个节点是正数第几个节点
第二次用于删除节点
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* headhead = new ListNode(0);headhead->next = head;int len = 0;auto pt = head;while(pt){len++;pt = pt->next;}int idx = len - n;pt = headhead;while(idx--){pt = pt->next;}pt->next = pt->next->next;return headhead->next;}};
第二次写题
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {int num = 0;auto pt = head;while(pt){num++;pt = pt->next;}auto dummy = new ListNode(0);dummy->next = head;pt = dummy;int move = num - n;while(move--){pt = pt->next;}pt->next = pt->next->next;return dummy->next;}};
2 使用两个指针,遍历一次
固定两个指针之间的距离,一旦前面一个指针到了尾部,那后面一个指针指向的就是要删除的
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {auto dummy = new ListNode(0);dummy->next = head;auto left = dummy, right = dummy;int t = n + 1;while(t--){right = right->next;}while(right){left = left->next;right = right->next;}left->next = left->next->next;return dummy->next;}};
第二次写题
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {auto dummy = new ListNode(0);dummy->next = head;auto fast = dummy, slow = dummy;int move = n + 1;while(move--){fast = fast->next;}while(fast){fast = fast->next;slow = slow->next;}slow->next = slow->next->next;return dummy->next;;}};
