//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个结点
最新推荐文章于 2022-11-01 23:31:44 发布