思路
两次遍历算法:第一次遍历得到链表长度len,第二次遍历到(len - n)后删除下一节点(要删除的节点位于len - n + 1)
一次遍历算法:双指针,保持恒定间距(此处设置为n)同时移动
代码实现
//两次遍历
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* curr = head;
int len = 0;
while(curr != NULL){
len++;
curr = curr->next;
}
int i = 1;
curr = head;
if (n == len) return head->next;
while(1){
if(i == len - n){
break;
}
curr = curr->next;
i++;
}
curr->next = curr->next->next;
return head;
}
};
//一次遍历
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* begin, * end;
begin = end = dummy;
int i = 0;
while(end->next != NULL){
end = end->next;
i++;
if(i > n){
begin = begin->next;
}
}
begin->next = begin->next->next;
return dummy->next;
};
};