編程題目:輸入一個鏈表,輸出該鏈表中倒數第k個節點


兩種方法

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM