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); }