删除单链表的倒数第k个结点

时间:2023-03-09 06:26:00
删除单链表的倒数第k个结点

策略

直接遍历总数为len,再次遍历第len-k+1个就是答案,但是这样遍历了O(N+k)个,可以在O在更短的时间内找到

图示

删除单链表的倒数第k个结点

参考代码

#include <iostream>
using namespace std; typedef struct ListNode
{
int value;
ListNode* next;
}ListNode; void createList(ListNode *&head)
{
head = new(ListNode);
head->value = ;
head->next = NULL; ListNode *p2 = new(ListNode);
p2->value = ;
p2->next = NULL;
head->next = p2; ListNode *p3 = new(ListNode);
p3->value = ;
p3->next = NULL;
p2->next = p3; ListNode *p4 = new(ListNode);
p4->value = ;
p4->next = NULL;
p3->next = p4;
}
void deleteList(ListNode *p)
{
ListNode *next = NULL;
while(p != NULL)
{
next = p->next;
delete p;
p = NULL;
p = next;
}
} bool deleteKNode_2(ListNode *head, int k)
{
if(head == NULL || k <= )
return false;
ListNode *pre = head;
for(int i = ; i < k - ; ++i)
{
if(pre == NULL)
return false;
pre = pre->next;
}
ListNode *cur = head;
while(pre->next)
{
pre = pre->next;
cur = cur->next;
}
cout << cur->value;
cout << "succeed:" << endl;
return true;
}
int main()
{
ListNode *head = NULL;
createList(head);
int k = ; cout << "Result:" << deleteKNode_2(head, ) << endl;
deleteList(head);
}

结果

删除单链表的倒数第k个结点

三点注意

1. 指针为空

2. k<=0

3. k<len