题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:
1.遍历链表得到链表的长度l,找到从前往后的第l-k+1个节点。需要遍历两遍。
2.遍历一次即可的方法:两个指针,第一个指针从头向尾移动k-1步后第二个指针开始从头向尾移动,第一个指针到尾结点时第一个指针指向倒数第k个结点。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL || k==0) return NULL; ListNode *pAhead=pListHead; ListNode *pBehind=NULL; for(int i=1;i<k;i++){ pAhead=pAhead->next; if(pAhead==NULL) return NULL; } pBehind = pListHead; while(pAhead->next != NULL){ pAhead=pAhead->next; pBehind=pBehind->next; } return pBehind; }
测试用例:
- 功能测试(第k个节点在链表的中间,第k个节点在链表的头节点,第k个节点在链表的尾结点)
- 特殊输入(链表的头节点为NULL,链表长度小于k,k等于0)
注意:
考虑特殊用例,上面测试用例中的特殊输入,增加代码的鲁棒性。
当用一个指针遍历链表不能解决问题时,可以尝试两个指针或多个指针以不同步长移动以达到目的。
相关题目:
1.求链表的中间节点:定义两个指针,同时从头节点除法,一个一次走一个节点,一个一次走两个节点,走得快的指针走到末尾时,走得慢的指针指向中间节点。
2.判断一个单向链表是否形成了环形结构:和1的方法一样,若走的快的指针与走的慢的指针相遇,则有环,若走的快的指针已经到了末尾也没有追上走得慢的指针,则无环。
时间: 2024-10-06 15:48:10