单向列表的倒数第k个结点的值 python实现

 1 #初始化链表的结点
 2 class Node():
 3     def __init__(self,item):
 4         self.item = item
 5         self.next = None
 6
 7 #传入头结点,获取整个链表的长度
 8 def length(headNode):
 9     if headNode == None:
10         return None
11     count = 0
12     currentNode =headNode
13     #尝试了一下带有环的链表,计算长度是否会死循环,确实如此,故加上了count限制 = =||
14     while currentNode != None and count <=1000:
15         count+=1
16         currentNode = currentNode.next
17     return count
18
19 #获取倒数第K个结点的值,传入头结点和k值
20 def findrKnode(head,k):
21     if head == None:
22         return None
23     #如果长度小于倒数第K个值,则返回通知没有这么长
24     elif length(head)<k:
25         print("链表长度没有倒数第"+str(k)+"数")
26         return None
27     else:
28         #设置两个针,一个快,一个慢,都指向头结点
29         fastPr = head
30         lowPr = head
31         count = 0
32         #让fastPr先走k个长度
33         while fastPr!=None and count<k:
34             count+=1
35             fastPr = fastPr.next
36         #此时fastPr和lowPr同速前进,当fastPr走到尾部,lowPr此处的值正好为倒数的k值
37         while fastPr !=None:
38             fastPr = fastPr.next
39             lowPr = lowPr.next
40         return lowPr
41
42 if __name__ == "__main__":
43     node1 = Node(1)
44     node2 = Node(2)
45     node3 = Node(3)
46     node4 = Node(4)
47     node5 = Node(5)
48     node6 = Node(6)
49     node7 = Node(7)
50     node8 = Node(8)
51     node9 = Node(9)
52     node10 = Node(10)
53     node1.next = node2
54     node2.next = node3
55     node3.next = node4
56     node4.next = node5
57     node5.next = node6
58     node6.next = node7
59     node7.next = node8
60     node8.next = node9
61     node9.next = node10
62     print(findrKnode(node1,5).item)
时间: 2024-10-19 07:32:25

单向列表的倒数第k个结点的值 python实现的相关文章

【华为OJ】【035-输出单向链表中倒数第k个结点】

[华为OJ][算法总篇章] [华为OJ][035-输出单向链表中倒数第k个结点] [工程下载] 题目描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 输入描述 输入说明 1 输入链表结点个数 2 输入链表的值 3 输入k的值 输出描述 输出一个整数 输入例子 8 1 2 3 4 5 6 7 8 4 输出例子 4 算法实现 import org.omg.SendingContext.RunTime; import java.util.List; import

找出单向链表中的倒数第k个结点

import java.util.Scanner; public class List { private Node first; private int N; class Node{ int data; Node next; } //顺便复习一下链表 public int size() { return N; } public boolean isEmpty() { return first==null; } public Node FindPrev(int pos){ Node tmp=fi

【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;ListNode* m_pNext;}; 我的思路:先翻转链表,再从翻转后的链表的头向尾数k-1个,返回,再次翻转链表. 代码如下:注意这个思路非常差.差的原因是:如果只是用最原始的方法,先遍历一遍计数,再遍历一遍找倒数第k个,需要遍历两遍.但我的思路,翻转两次链表就要遍历两遍.还要在走k-1步找倒数第k

13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 题目分析: 1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一

IT公司100题-13-求链表中倒数第k个结点

问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法1: 首先计算出链表中节点的个数n,然后倒数第k个节点,为正数n-k+1个节点. 需要遍历链表2次. 方法1代码实现: 1 // 13_1.cc 2 #include <iostream> 3 using namespace std; 4 5 struct list_node { 6 int da

【面试题015】链表中倒数第k个结点

[面试题015]链表中倒数第k个结点    可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指向的就是倒数第K个结点:两个指针的间距保持为k-1: 当我们遍历列表的时候发现用一个指针是解决不了问题的,我们可以尝试用两个指针来解决问题, 一个指针走的比另外一个指针走得快一点,或者先让其中的一个指针走了若干步,然后再让第二个指针来走: kth.cpp: 123456789101112131415

剑指Offer面试题15(Java版):链表中倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点. 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点 为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步.可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通. 既然不能从尾节点开始遍历这个链表,我们还是把思路回到头

第13题:取链表中倒数第K个结点

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/45037001 第13题:输入一个单向链表,输出该链表中倒数第K个结点.链表的倒数第0个结点为链表的尾指针. 考虑如何在程序执行中保留K这个信息,这儿使用两个坐标,要让这两个坐标之间相距K个距离,于是当前一个坐标到达尾指针时,后一个坐标恰好与尾相距K个结点距离. 代码 package test013; import test007.Node; /** * Create

剑指offer编程-链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 1.遍历链表得到链表的长度l,找到从前往后的第l-k+1个节点.需要遍历两遍. 2.遍历一次即可的方法:两个指针,第一个指针从头向尾移动k-1步后第二个指针开始从头向尾移动,第一个指针到尾结点时第一个指针指向倒数第k个结点. ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL || k==0) return NULL; Li