题目描述
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针.
要求:
(1)正序构建链表;
(2)构建后要忘记链表长度。
数据范围:链表长度满足
1
≤
n
≤
1000
1 \le n \le 1000
1≤n≤1000,
k
≤
n
k \le n
k≤n ,链表中数据满足
0
≤
v
a
l
≤
10000
0 \le val \le 10000
0≤val≤10000
本题有多组样例输入。
输入描述
输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值
输出描述
输出一个整数
代码
重点在于题目要求我们在找倒数第k个结点,即正数第n-k+1个结点的时候忘记列表的长度,因此在函数中还需遍历单链表算一次链表的长度。
class ListNode:
def __init__(self, val: int):
self.val = val
self.next = None
# 根据存储结点值的列表构造单链表
def create_list(head:ListNode,value_list):
cur=head
for value in value_list:
cur.next=ListNode(value)
cur=cur.next
return head
# 输出单向链表中倒数第k个结点
def find_reverse_k(head:ListNode,k):
cur=head
n=1 # 记录单链表的长度
ind=1
while cur.next:
cur=cur.next
n+=1
# 即找单向链表正数的n-k+1个结点
cur=head
if n-k+1>0:
while ind<n-k+1:
cur=cur.next
ind+=1
return cur
else:
return None # 异常返回空指针
while True:
try:
n=int(input())
L=list(map(int,input().split()))
k=int(input())
# 构建单链表
head=ListNode(L[0])
create_list(head,L[1:])
# 找到倒数第k个结点
node=find_reverse_k(head,k)
print(node.val)
except:
break