在linked list中找倒数第N个结点
解题思路:
设置一快一慢指针,快指针先走N步,然后快慢指针同时走,当快指针走到末尾时,慢指针对应的节点就是倒数第N个节点。
LinkList.h添加函数
//获取链表的倒数第n个节点
Node* GetLastNNode(int n);
LinkList.cpp函数实现如下:
Node* LinkList::GetLastNNode(int n)
{
if(head == NULL)
{
cout<<"linklist is empty";
return NULL;
}
if(n <= 0 || n > length)
{
cout<<"n is invalid"<<" n = "<<n<<" length = "<<length<<endl;
return NULL;
}
//p指针先走n步
Node* p = head;
while(p != NULL && n--)
{
p = p->next;
}
Node* q = head;
while(p!= NULL)
{
q = q->next;
p = p->next;
}
return q;
}
测试代码如下:
void test_suanfa_2(LinkList link)
{
int data;
cout<<"pleast input last n to get a node"<<endl;
cin>>data;
Node* nNode = link.GetLastNNode(data);
if(nNode != NULL)
{
cout<<"the last n data is "<< nNode->data<<endl;
}
cout<<"pleast input invlid last n to get a node"<<endl;
cin>>data;
nNode = link.GetLastNNode(data);
if(nNode != NULL)
{
cout<<"the last n data is "<< nNode->data<<endl;
}
}