链表中倒数第k个结点(算法15)
文章目录
问题:实现一个函数,输入k,返回给定链表中的倒数第k个结点。
原理:
不难看出,链表的倒数第k个结点就是链表的第(n-k+1)个结点(前提是k<=n)。第(n-k+1)个结点可以表示如下:
n-k+1 = n-(k-1)
因此,就可以把倒数第k个结点和尾结点的举例(k-1),如果你觉得不够直观可以画图理解。这样,我们在遍历链表时可以使用一_sentinel
哨兵指针和正常指针pointer
,保持它们的距离为k-1。哨兵指针_sentinel
指向最后一个结点的时候,正常指针pointer
就指第n-k+1
个结点,也就是倒数第k个结点。
那么怎样保持pointer
指针和_sentinel
距离为恒定值k呢?这个容易:在一开始时先让_sentinel
走k-1步。
这就是解决该问题的大概思路,但需要注意一下细节:k所指定的结点要在链表范围内,否则会出现越界,指定的结点根本不在链表内。具体表现在,_sentinel
移动没有达到k-1步就已经到达链表结尾。
实现步骤:
(1)对异常输入的检测
(2)_sentinel
指针位移k-1步,如果在到达k-1结点前到达链表结尾,则出错
(2)同时移动pointer
和_sentinel
直到后者到达链表结尾。
(4)_sentinel
到达链表结尾后,如果
实现:
1 | def last_k_node(p_head, k): |
测试代码
1 | def main(): |
测试结果如下
1 | main() |
完。