• 编程题目:输入一个链表,输出该链表中倒数第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
  • 相关阅读:
    Python的招牌花旦
    Python的for循环究竟是什么回事儿
    人人都喜欢用的十大python标准库
    有编程基础学python怎么赚点小钱?
    python3 Flask Redis 如何切换数据库
    贪心算法
    【ACM】nyoj_106_背包问题_201308152026
    【ACM】nyoj_14_会场安排问题_201308151955
    【ACM】nyoj_132_最长回文子串_201308151713
    【ACM】nyoj_47_过桥问题_201308151616
  • 原文地址:https://www.cnblogs.com/xautxuqiang/p/6431730.html
Copyright © 2020-2023  润新知