删除链表的倒数第K个结点

  • 使用两个指针解决。
  • 首先,用一个指针p指向头结点,将该指针反复指向下一个结点,一共K次,如果此时指针为空,说明刚好删除的是头结点,返回head->next即可。
  • 如果不为空,用另一个指针q指向头结点,当p指针不为空时,将p指针和q指针同时指向下一个结点,直到p指针为空。此时q指针的下一个结点为要删除的结点,通过q->next=q->next->next,删除该结点,返回head即可。
  • C++完整代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
struct ListNode 
{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
ListNode* help(ListNode* a,int k)
{
ListNode *p1 = a;
ListNode *p2 = a;
for (int i = 0; i < k; i++)
{
p1 = p1->next;
}
if (p1 == NULL)
return a->next;
while (p1->next != NULL)
{
p1 = p1->next;
p2 = p2->next;
}
p2->next = p2->next->next;
return a;
}
int main()
{
int n;
int k;
cin >> n >> k;
ListNode *a = new ListNode(NULL);
ListNode *pa = a;
ListNode *result;
int temp;
while (n--)
{
cin >> temp;
pa->next = new ListNode(temp);
pa = pa->next;
}
result = help(a->next,k);
while (result != NULL)
{
cout << result->val;
result = result->next;
}
system("pause");
return 0;
}


猜你喜欢

转载自blog.csdn.net/zrh_CSDN/article/details/79994399