直观地想,如果想得到倒数第k 个节点,那么从后面往前数k个啰?这个不行,单向链表
是行不通的,那么也可以这样,设有n个节点,那么向前往后数n-k+1个吧。但是这种方法
要两次遍历链表,第一次是获得链表节点的个数n.第二次才找到倒数第k个节点。
比较巧的方法是:
设两个指针,一个指各头,另一个与前一个指针相隔k-1个节点,则当后面那个指针
指向尾的时候,前面那个就指向了倒数第k个节点了。
注意代码的鲁棒性:
#ifndef COUNT_BACKWARD_H
#define COUNT_BACKWARD_H
#include<iostream>
struct ListNode
{
int m_value;
struct ListNode *m_pNext;
};
ListNode *findBackward_k(ListNode **head,int k_backward){
if(head==NULL||*head==NULL||k_backward==0){
return NULL ;
}
if((*head)->m_pNext==NULL&&k_backward==1){
return *head;
}
ListNode *m_phead=*head;
ListNode *pre_kbackward=m_phead;
ListNode *m_pend=m_phead-1;
int count_dis=k_backward;
while(m_pend->m_pNext!=NULL){
if(count_dis>0){
m_pend=m_pend->m_pNext;
count_dis--;
continue;
}
pre_kbackward=pre_kbackward->m_pNext;
m_pend=m_pend->m_pNext;
}
if(count_dis!=0){
throw("invalid input value");
}
return pre_kbackward;
}
#endif
发散思维:
时间: 2024-10-14 19:47:28