兩種方法
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