文章目录
描述:
输入一个单向链表,输出该链表中倒数第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() :打印输出。
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)
序号 | 函数 | 说明 |
---|---|---|
0 | list1 = [] | 创建空列表 |
0 | list1 = list() | 创建空列表 |
1 | list2 = [元素] | 创建列表。输入参数可以是任意类型 |
1 | list2 = list(元素) | 创建列表。输入参数可以是任意类型 |
—— | —— | —— |
2 | list[index] | 索引(负数表示倒叙) |
3 | list[start, end] | 切片(获取指定范围元素) |
4 | list[::-1] | 逆序输出(步长为1) |
—— | —— | —— |
5 | list.append(元素) | 在列表末尾添加任意类型的一个元素 |
6 | list.extend(元素) | 添加可迭代序列 |
7 | list.insert(index, 元素) | 在指定位置插入一个元素 |
—— | —— | —— |
8 | list.remove(元素) | 删除指定元素。(1)若有多个相同元素,则只删除第一个元素。(2) 若不存在,则系统报错。 |
9 | list.pop(index) | 删除指定位置元素。默认删除最后一项。 |
10 | del list(index) | 删除指定位置元素 |
11 | list.clear() | 清空内容,返回空列表 |
—— | —— | —— |
12 | list.index(元素) | 索引元素位置。(1)若有多个相同元素,则只返回第一个元素的位置。(2)若不存在,则系统报错。 |
13 | list.count(元素) | 计算指定元素出现的次数 |
14 | list.reverse() | 逆序输出 |
15 | list.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
"""