题目描述
思路:使用双指针,快指针先走n步,然后让快慢指针一起走,当快指针走到空时,则此时慢指针所在的位置即为删除节点的位置。如总元素为5的链表中删除倒数第2个元素,快指针先走两步,再走到空需要4步,而倒数第二正好对应的是正数第四,因此就找到了目标元素。有点不同的是本题要让快指针走n+1步,因为要找到目标元素的前一个元素才能进行删除的操作。
时间复杂度:O(N)
空间复杂度:O(1)
struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
typedef struct ListNode Node;
Node* dummyhead=(Node*)malloc(sizeof(Node));
dummyhead->next=head;
Node* fast=dummyhead;
Node* slow=dummyhead;
n++;
//找到删除节点的前一个节点
while(n--&&fast!=NULL)
{
fast=fast->next;
}
while(fast!=NULL)
{
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
return dummyhead->next;
}