链表的巧解

直观地想,如果想得到倒数第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
发散思维:


浙公网安备 33010602011771号