您的位置:首页 > 其它

求链表的倒数第K个节点,如果K大于链表长度则返回NULL

2013-04-30 21:21 330 查看
/*
思路:两个指针变量p1,p2,开始都指向头结点
p1先向前移动K个位置,如果已经为NULL,则返回NULL
否则,p2也开始跟p1一起向后移动,因为p1比p2快K个位置
所以当,p1指向结束位置时,p2刚好指向倒数第K个位置
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <iostream.h>
struct ListNode
{
int data;
ListNode* next;
};
void InitList(ListNode** head)
{
*head = (ListNode*)malloc(sizeof(ListNode));
(*head)->next = NULL;
}
void InsertList(ListNode* head,int d)
{
assert(head!=NULL);
ListNode* pNewNode = (ListNode*)malloc(sizeof(ListNode));
pNewNode->data = d;
pNewNode->next = head->next;
head->next = pNewNode;
}
void PrintList(ListNode* head)
{
if(head == NULL)
{
return ;
}
ListNode* Next = head->next;
while(Next!=NULL)
{
cout<<Next->data<<endl;
Next = Next->next;
}
}
/*
查找倒数第K个结点的核心代码,
*/

ListNode* theBackKthNode(ListNode* head,int k)
{
if(NULL == head || k<=0)
{
return NULL;
}
ListNode* p1 = head;
ListNode* p2 = head;
while(NULL!=p1 && k>1)
{
p1 = p1->next;
k--;
}
if(p1==NULL)
{
return NULL;
}
while(NULL!=p1->next)
{
p2 = p2->next;
p1 = p1->next;
}
return p2;
}

int main()
{
ListNode* pListHead = NULL;
ListNode* theKth = NULL;
int k=8;
InitList(&pListHead);
for(int i=9;i>=0;i--)
{
InsertList(pListHead,i);
}
theKth = theBackKthNode(pListHead,k);
cout<<"所有的结点为:"<<endl;
PrintList(pListHead);
cout<<"倒数第"<<k<<"个结点是"<<theKth->data<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: