两种方法
1.在链表的初始化数据中加入 num 数据, 每添加一个节点,num加1,每删除一个节点,num减1
查找倒数第k个元素,即 指向第一个节点的指针向后移动 num - k 步。
2.使用两个指针 i 和 j, i和j初始化都指向第一个节点。
查看倒数第k个元素,先将 j 向右移动 k-1 步。
再将 i 和 j 同时向右移动,直到 j 指向最后一个元素结束。
这时候 i 指向的元素即 倒数第k个元素。返回 i 指向节点的值即可。
1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 4 class Node(object): 5 def __init__(self, elem, next_=None): 6 self.elem = elem 7 self.next = next_ 8 9 class Simple_List(object): 10 def __init__(self): 11 self.head = None 12 self.num = 0 13 14 def is_empty(self): 15 return self.head is None 16 17 def prepend(self, elem): 18 self.head = Node(elem, self.head) 19 self.num += 1 20 21 def prepop(self): 22 if self.is_empty(): 23 raise ValueError("List is Empty") 24 e = self.head.elem 25 self.head = self.head.next 26 self.num -= 1 27 return e 28 29 def bianli(self): 30 p = self.head 31 li = [] 32 while p: 33 li.append(p.elem) 34 p = p.next 35 return li 36 37 def find_the_key(self, key): 38 n = self.num - key 39 p = self.head 40 while n: 41 p = p.next 42 n -= 1 43 return p.elem 44 45 def find_the_key1(self,key): 46 i,j = self.head, self.head 47 while key-1: 48 j = j.next 49 key -= 1 50 while j.next: 51 i = i.next 52 j = j.next 53 return i.elem 54 55 if __name__ == "__main__": 56 sl = Simple_List() 57 for i in [1,4,8,2,4,8,5]: 58 sl.prepend(i) 59 print("链表:",sl.bianli()) 60 key = int(input("查看该链表倒数第k个值:")) 61 print("倒数第k个值:",sl.find_the_key(key)) 62 print("倒数第k个值:",sl.find_the_key1(key))
之前写这个题目的时候没有注意到边界问题,当用户输入的key值不合理时,会发生错误。
所以我们要对用户输入的数据进行判断并处理。
修改的地方如下,其他地方不变
def find_the_key(self, key): if key < 1 or key > self.num: raise ValueError("num must in 0<key<={}".format(self.num)) n = self.num - key p = self.head while n: p = p.next n -= 1 return p.elem def find_the_key1(self,key): if key < 1: raise ValueError("num is unabled,please repeat input") i,j = self.head, self.head while key-1: j = j.next key -= 1 if j is None: raise ValueError("num is unabled,please repeat input") while j.next: i = i.next j = j.next return i.elem