1、查找单链表的中间结点,要求只遍历一次链表

2、查找链表的倒数第K个结点,要求只遍历一次链表


单链表结构参见 2016-1-2 13:56 发表博客

SListNode* FindMidOnce(SListNode*&pHead)//查找单链表的中间结点,要求只遍历一次链表
{
 //思路:两个指针一快一慢,快指针走两步,慢指针走一步
 assert(pHead);
 SListNode* fast = pHead;
 SListNode* slow = pHead;
 while (fast&&fast->next)
 {
  slow = slow->next;
  fast = fast->next->next;
 }
 return slow;
}
SListNode* FindLKOnce(SListNode*pHead, int K)//查找链表的倒数第K个结点,要求只遍历一次链表
{
 //思路:两个指针一快一慢,快指针先走K步,然后快慢指针一起走
 assert(pHead);
 if (K <= 0)
  return NULL;
 SListNode* fast = pHead;
 SListNode* slow = pHead;
 while (K--&&fast)
 {
  fast = fast->next;
 }
 if (K >= 0)
 {
  return NULL;
 }
 while (fast)
 {
  fast = fast->next;
  slow = slow->next;
 }
 return slow;
}


void Test6()  //  FindMidOnce/FindLKOnce
{
 printf("//Test6() FindMidOnce/FindLKOnce \n");
 SListNode *LL = NULL;
 SListNode *tmp = NULL;
 PushBack(LL, 1);
 PushBack(LL, 2);
 PushBack(LL, 3);
 PushBack(LL, 5);
 PrintNode(LL);

 printf("FindMidOnce = %d \n", FindMidOnce(LL)->data);

 tmp = FindLKOnce(LL, 0);
 printf("\n(找倒数第0个结点)\nFindMidOnce = ");
 PrintNode(tmp);

 tmp = FindLKOnce(LL, 1);
 printf("\n(找倒数第1个结点)\nFindMidOnce = ");
 PrintNode(tmp);

 tmp = FindLKOnce(LL, 4);
 printf("\n(找倒数第4个结点)\nFindMidOnce = ");
 PrintNode(tmp);

 tmp = FindLKOnce(LL, 5);
 printf("\n(找不存在的结点倒数第5个结点)\nFindMidOnce = ");
 PrintNode(tmp);
 
}

笔试面试,单链表相关(3)遍历一次找中间结点、倒数第K个结点_面试