华为机试题: HJ51 输出单向链表中倒数第k个结点(python)

描述

输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:

struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};

正常返回倒数第k个结点指针,异常返回空指针.

要求

(1)正序构建链表;
(2)构建后要忘记链表长度。

数据范围:链表长度满足 1 ≤ n ≤ 1000 ,k ≤ n ,链表中数据满足 0 ≤ val ≤ 10000

输入描述

本题有多组样例输入。
1 输入链表结点个数
2 输入链表的值
3 输入k的值

输出描述:输出一个整数


示例1

输入:
8
1 2 3 4 5 6 7 8
4

输出:
5

Python3

while 1:
    try:
        a, list1, b = int(input()), list(input().split()), int(input())
        print(list1[-b] if b != 0 else 0)
    except:
        break

知识点详解

1、input():获取控制台(任意形式)的输入。输出均为字符串类型。

str1 = input()
print(str1)
print('提示语句:', str1)
print(type(str1))

'''
asd123!#
提示语句: asd123!#
<class 'str'>
'''
常用的强转类型说明
int(input())强转为整型(输入必须时整型)
list(input())强转为列表(输入可以是任意类型)

1.1、input() 与 list(input()) 的区别、及其相互转换方法

  • 相同点:两个方法都可以进行for循环迭代提取字符,提取后都为字符串类型。
  • 不同点str = list(input()) 将输入字符串转换为list类型,可以进行相关操作。如: str.append()
  • 将列表转换为字符串:str_list = ['A', 'aA', 2.0, '', 1]
  • 方法一:print(''.join(str))
  • 方法二:print(''.join(map(str, str_list)))

备注:若list中包含数字,则不能直接转化成字符串,否则系统报错。

  • 方法一:print(''.join([str(ii) for ii in str_list]))
  • 方法二:print(''.join(map(str, str_list)))
    map():根据给定函数对指定序列进行映射。即把传入函数依次作用到序列的每一个元素,并返回新的序列。

(1) 举例说明:若list中包含数字,则不能直接转化成字符串,否则系统报错。

str = ['25', 'd', 19, 10]
print(' '.join(str))

'''
Traceback (most recent call last):
 File "C:/Users/Administrator/Desktop/test.py", line 188, in <module>
   print(' '.join(str))
TypeError: sequence item 3: expected str instance, int found
'''

(2)举例说明:若list中包含数字,将list中的所有元素转换为字符串。

str_list = ['A', 'aA', 2.0, '', 1]
print(''.join(str(ii) for ii in str_list))
print(''.join([str(ii) for ii in str_list]))
print(''.join(map(str, str_list))) 		# map():根据给定函数对指定序列进行映射。即把传入函数依次作用到序列的每一个元素,并返回新的序列。

'''
AaA2.01
AaA2.01
AaA2.01
'''

2、print() :打印输出。

【Python】print()函数的用法

x, y = 1, 9
print('{},{}' .format(x, y))	# 打印方法一
print('*'*10)					# 打印分割符
print(x, ',', y)				# 打印方法二

'''
1,9
**********
1 , 9
'''

3、list列表的常用操作(15+9函数)—— 列表是一个有序可变序列。

一般来说,有序序列类型都支持索引,切片,相加,相乘,成员操作。

  • 不可变数据类型布尔类型(bool)、整型(int)、字符串(str)、元组(tuple)
  • 可变数据类型列表(list)、集合(set)、字典(dict)
序号函数说明
0list1 = []创建空列表
0list1 = list()创建空列表
1list2 = [元素]创建列表。输入参数可以是任意类型
1list2 = list(元素)创建列表。输入参数可以是任意类型
——————
2list[index]索引(负数表示倒叙)
3list[start, end]切片(获取指定范围元素)
4list[::-1]逆序输出(步长为1)
——————
5list.append(元素)在列表末尾添加任意类型的一个元素
6list.extend(元素)添加可迭代序列
7list.insert(index, 元素)在指定位置插入一个元素
——————
8list.remove(元素)删除指定元素。(1)若有多个相同元素,则只删除第一个元素。(2) 若不存在,则系统报错。
9list.pop(index)删除指定位置元素。默认删除最后一项。
10del list(index)删除指定位置元素
11list.clear()清空内容,返回空列表
——————
12list.index(元素)索引元素位置。(1)若有多个相同元素,则只返回第一个元素的位置。(2)若不存在,则系统报错。
13list.count(元素)计算指定元素出现的次数
14list.reverse()逆序输出
15list.sort(*, key=None, reverse=False)(1)默认从小到大排列。(2)reverse=True 表示从大到小排序。
——————
(1)len(list)元素个数
(2)type(list)查看数据类型
(3)max(list)返回最大值(不能有嵌套序列)
(4)min(list)返回最小值(不能有嵌套序列)
(5)list(tuple)将元组转换为列表
(6)list1 + list2+ 操作符(拼接)
(7)list * 3* 操作符(重复)
(8)元素 in list(in / not in)成员操作符(判断给定值是否在序列中)
(9)for i in list:遍历

4、链表的常用操作(8个函数)—— 链表是一个非连续存储的线性表(节点 = 数据域 + 指针域)。

  • 在C/C++中,通常采用指针+结构体来实现链表;而在Python中,则采用引用+类来实现链表。
  • 常用的数据结构:数组、链表(一对一)、栈和队列、哈希表、树(一对多)、图(多对多)。列表与链表的对比

链表(Linked List)是一种线性表数据结构,使用一组任意的存储单元(不是进行连续存储的。),来存储一组具有相同类型的数据。

链表由多个元素组成,每个元素都是一个对象,每个对象称为一个节点。每个节点包含两个部分:左边存储着自定义数据(数据域),右边存储着下一个节点的链接地址(指针域)。

  • 通过各个节点之间的相互连接,最终串联成一个链表。
  • (1)单链表:它的每个链节点指向下一个链节点。
  • (2)双向链表(Doubly Linked List):它的每个链节点中有两个指针,分别指向直接后继和直接前驱。
  • (3)循环链表(Circular Linked List):它的最后一个链节点指向第一个链节点,形成一个环。
    在这里插入图片描述

链表的常见操作

链表的常见操作说明
is_empty()链表是否为空
length()链表长度
travel()遍历整个链表
add(item)链表头部添加元素
append(item)链表尾部添加元素
insert(pos, item)指定位置添加元素
remove(item)删除节点
search(item)查找节点是否存在
算法实现步骤+图解

具体代码:

class Node(object):
    """单链表的节点类,即 ListNode 类。定义了两个实例变量"""

    def __init__(self, elem):
        self.elem = elem
        self.next = None


class SingleLinkList(object):
    """单链表的链表类,即 LinkedList 类。定义了常用操作"""

    def __init__(self, node=None):
        self.__head = node

    def is_empty(self):
        """判断链表是否为空"""
        return self.__head is None

    def length(self):
        """链表长度"""
        cursor = self.__head
        count = 0
        while cursor is not None:
            count += 1
            cursor = cursor.next
        return count

    def travel(self):
        """遍历链表"""
        cursor = self.__head
        while cursor is not None:
            print(cursor.elem, end=' ')
            cursor = cursor.next

    def add(self, elem):
        """链表头部添加元素"""
        node = Node(elem)
        node.next = self.__head
        self.__head = node

    def append(self, elem):
        """链表尾部添加元素"""
        node = Node(elem)
        if self.is_empty():
            self.__head = node
        else:
            cursor = self.__head
            while cursor.next is not None:
                cursor = cursor.next
            cursor.next = node

    def insert(self, pos, elem):
        """在指定位置插入元素"""
        node = Node(elem)
        if pos <= 0:
            self.add(elem)
        elif pos > (self.length() - 1):
            self.append(elem)
        else:
            cursor = self.__head
            count = 0
            while count < pos - 1:
                count += 1
                cursor = cursor.next
            node.next = cursor.next
            cursor.next = node

    def remove(self, elem):
        """删除元素"""
        cursor = self.__head
        pre = None
        while cursor is not None:
            if cursor.elem == elem:
                if cursor == self.__head:
                    self.__head = cursor.next
                    break
                else:
                    pre.next = cursor.next
                    break
            else:
                pre = cursor
                cursor = cursor.next

    def search(self, elem):
        """查找元素"""
        cursor = self.__head
        while cursor is not None:
            if cursor.elem == elem:
                return True
            else:
                cursor = cursor.next
        else:
            return False


if __name__ == "__main__":
    link1 = SingleLinkList()
    print(link1.is_empty())
    print(link1.length())
    
    link1.append(1)
    link1.append(2)
    link1.add(6)
    link1.insert(1, 7)
    link1.insert(-1, 8)
    link1.travel()
    print()
    print(link1.travel())
    
    link1.remove(9)
    link1.travel()
    print()
    print(link1.travel())


"""
True
0
8 6 7 1 2
8 6 7 1 2 None
8 6 7 1 2
8 6 7 1 2 None
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖墩会武术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值