链表的巧解

it2026-01-13  16

直观地想,如果想得到倒数第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 发散思维: 来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/yml435/p/4655491.html

最新回复(0)