查找单链表的中间节点,要求只能遍历一次链表
这个思路比较简单,利用快慢指针法即可,一个快指针【一次走两步】,一个慢指针【一次走一步】,只要快指针走到结束为止,慢指针恰好就在链表的中间!只不过快指针一次走两步,需要考虑链表元素个数为奇数个的问题,所以结束标志不只是快指针走到NULL位置,快指针的NEXT走到NULL也算是结束:
pNode FindMidNode(pList head)
{
pNode fast = head;
pNode slow = head;
if (head == NULL || head->next == NULL)
return head;
while ((fast != NULL) && (fast->next != NULL))
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
查找单链表的倒数第k个节点,要求只能遍历一次链表
这个与上面的查找中间节点的方式是一样的,也是使用两个指针只不过这次都是使用慢指针的方式,让一个指针先走k步,然后另一个指针才能开始走,直到先走的指针走到链表结尾,此时后走的指针刚好走到倒数第k个节点
//查找单链表的倒数第k个节点,要求只能遍历一次链表
pNode FindLastKNode(pList *pplist, int k)
{
pNode first = *pplist;
pNode catch = *pplist;
int num = 0;
assert(pplist != NULL);
if (*pplist == NULL)
return NULL;
while (first != NULL)
{
first = first->next;
if (num++ >= k)
{
catch = catch->next;
}
}
return catch;
}
还是要注意特殊情况的处理!