//1.相当于遍历链表两次,第一次结点指针全部入栈,第二次找到倒数第k个结点
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
//注意防御性编程:
//1.如果k大于链表的个数.
//2.如果k为0
//3.如果链表为空
if ( NULL == pListHead || 0 == k )
return NULL;
stack<ListNode*> s;
while ( NULL != pListHead ){
s.push( pListHead );
pListHead = pListHead->next;
}
if ( s.size( ) < k )
return NULL;
for ( size_t i = 1; i < k; ++i )
s.pop( );
return s.top( );
}
//2.只需遍历链表一次的解法:
//大致思路: 两个指针都指向头节点,第一个指针先在链表上走k-1步,此时第二个指针和第一个指针同时向后走,当第一个指针走到结尾时,第二个指针的指向就是倒数第k个结点。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
if ( NULL == pListHead || 0 == k )
return NULL;
size_t count = 0;
ListNode* pNode1 = pListHead;
ListNode* pNode2 = pListHead;
//根据我们思路以及前面判断过的k不等于0. 所以k-1至少为0.
for ( size_t i = 0; i < k-1; ++i, ++count ){
寻找链表中倒数第k个结点
最新推荐文章于 2023-05-02 00:29:20 发布
本文介绍了两种方法找到链表中倒数第k个节点,包括通过遍历两次链表利用栈的方式以及一次遍历使用双指针的方法。第一种方法直观且不易出错,但需要遍历两次;第二种方法更高效,仅遍历一次,但需要注意更多的边界条件。最后提供了《剑指Offer》中简洁的解决方案。
摘要由CSDN通过智能技术生成