剑指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;
}
#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;
}
相关文章推荐
- 剑指offer 面试题15—链表中倒数第k个节点
- 剑指offer-题15:链表中倒数第k个节点
- 剑指Offer之链表中倒数第k个节点(题15)
- 剑指offer15:链表中倒数第k个节点
- 剑指offer 面试题15 链表中的倒数第k个节点
- 剑指Offer-15-链表中的倒数第k个节点
- 剑指offer--15.链表中倒数第k个节点
- [剑指offer]面试题15.链表中倒数第K个节点
- 剑指Offer---面试题15:链表中的倒数第k个节点
- 【剑指offer】题15:链表倒数第k个节点
- 剑指offer_面试题15_链表中倒数第k个节点(考虑问题要全面)
- 剑指Offer15:链表中倒数第k个节点
- 【面试题】剑指Offer-15-求倒数第K个节点
- 剑指offer--面试题15:链表中倒数第K个结点--Java实现
- 剑指offer-链表中倒数第K个节点-php
- 剑指offer面试题15——链表中倒数第k个结点
- 剑指Offer面试题:14.链表的倒数第k个节点
- 【剑指offer】链表中的倒数第k个节点
- 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)
- 牛客网 剑指offer-链表中倒数第K个节点