/*
面试题15:输入一个链表,输出该链表中倒数第k个结点,本题从1开始计数,即链表的尾结点就是倒数第1个结点,
例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点。
*/
/*
基本思路:
定义两个指针,地一个指针从链表的头指针开始向前走k-1步, 第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个指针的距离保持在k-1,当地一个指针走到链表的尾部,第二个指针正好是倒数第k个结点。
*/
struct ListNode
{
int m_nvalue;
ListNode* m_pNext;
};
//创建链表
ListNode* CreateListNode(int value)
{
ListNode *pNode = new ListNode();
pNode->m_nvalue = value;
pNode->m_pNext = NULL;
return pNode;
}
//连接链表的两个结点
void ConnectListNode(ListNode* pCurrent,ListNode* pNext)
{
if(pCurrent == NULL)
{
cout<<"前一个节点为空:"<<endl;
exit(1);
}
else
{
pCurrent->m_pNext = pNext;
}
}
//打印链表信息
void PrintList(ListNode* pHead)
{
ListNode *pNode = pHead;
while(pNode != NULL)
{
cout<<pNode->m_nvalue <<"->";
pNode = pNode->m_pNext ;
}
cout<<"nul"<<endl;
}
//删除链表倒数第k个结点
ListNode* FindKthToTail(ListNode* pListHead,unsigned int k)
{
if(pListHead == NULL || k == 0)
return NULL;
ListNode *pHead = pListHead;
ListNode *pBehind = NULL;
for(unsigned int i = 0;i<k-1;i++)
{
if(pHead->m_pNext !=NULL)
pHead = pHead->m_pNext ;
else
{
return NULL;
}
}
pBehind = pListHead;
while(pHead->m_pNext != NULL)
{
pHead = pHead->m_pNext ;
pBehind = pBehind->m_pNext ;
}
return pBehind;
}
int main()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ListNode* pNode6 = CreateListNode(6);
ListNode* pNode7 = CreateListNode(7);
ConnectListNode(pNode1,pNode2);
ConnectListNode(pNode2,pNode3);
ConnectListNode(pNode3,pNode4);
ConnectListNode(pNode4,pNode5);
ConnectListNode(pNode5,pNode6);
ConnectListNode(pNode6,pNode7);
PrintList(pNode1);
ListNode* pNode = FindKthToTail(pNode1,2);
PrintList(pNode);
}