您的位置:首页 > Web前端

剑指offer 15-链表中第k个节点

2015-05-13 14:43 162 查看
求链表中倒数第K个节点,思路很简单我们在遍历时维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步之前,第二个指针保持不动;在第k-1步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。

#include <iostream>
#include <stack>
using namespace std;

//无头节点
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};

void InsertListNode( ListNode **head, int value)
{
ListNode* p= new ListNode();
p->m_nValue = value;
p->m_pNext = NULL;

if (*head == NULL)
{
*head = p;
}
else
{
ListNode* node = *head;
while(node->m_pNext != NULL)
node = node->m_pNext;

node->m_pNext = p;
}
}

void FindKThTotail(ListNode * node , int k)
{
if (node ==NULL || k == 0) //此处k=0情况未考虑
return;

ListNode *p =node ,*q;
q = p;

for(int i=0; i< k-1 ;i++)
{
if ( p->m_pNext !=NULL)
{
p = p->m_pNext;
}
else ////k大于链表长度
return;
}

while(p->m_pNext !=NULL)
{
p =p->m_pNext;
q =q->m_pNext;
}
cout<<q->m_nValue<<endl;
}

void printListNode(ListNode * node)
{
while(node!=NULL)
{
cout<<node->m_nValue <<" ";
node = node->m_pNext;
}
cout<<endl;
}

int main(int argc, char* argv[])
{
ListNode *head = NULL;
int a[]= {1,2,3,4,5,6};
for(int i=0;i<sizeof(a)/sizeof(int);i++)
{
InsertListNode( &head,a[i]);
}
printListNode(head);

int k = 3;
FindKThTotail(head , k); //

k = 6;
FindKThTotail(head , k);

k=1;
FindKThTotail(head , k);

k=0;
FindKThTotail(head , k);

FindKThTotail(NULL , k);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: