题解 | #输出单向链表中倒数第k个结点#
输出单向链表中倒数第k个结点
https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d
class ListNode:
"""链表节点"""
def __init__(self, item, next=None):
self.item = item
self.next = next
class LinkedList:
"""链表"""
def __init__(self):
self.head = None
def create(self, data):
"""以对应date建立单链表"""
self.head = ListNode(0)
cur = self.head
for i in range(len(data)):
node = ListNode(data[i])
cur.next = node
cur = cur.next
def travel(self):
"""列表遍历"""
p = self.head.next
while p:
print(p.item, end=" ")
p = p.next
print()
def length(self):
"""求链表的长度"""
p = self.head
count = 0
while p:
count += 1
p = p.next
return count-1
def get_fuitem(self, position):
"""获取逆序某位置的元素"""
if position < 0 or position >= self.length():
return None
p = self.head
count = 0
while count != self.length()-position+1:
p = p.next
count += 1
return p.item
while True:
try:
n = int(input())
l = list(map(int,input().split(" ")))
k = int(input())
a = LinkedList()
a.create(l)
if n==k==1:
print(a.head.next.item)
else:
print(a.get_fuitem(k))
except:
break
本题使用的是最常规的,正序遍历链表,然后输出n-k+1的元素,另一种算法是快慢索引,有机会在用
使用class 建立单链表,在其中的定义creat()来输入一个单列表,使用length求长度,travel是不需要的顺手写的,使用
get_fuitem方法得到倒叙的第k个元素。
注意:这个单链表创造时,其实head是固定的 0 ,但是我在计算length时将0抹去了,就是减了1.
在遍历单链表时,我实际上是从head的next开始遍历的。实际效果使用是正常的,就是注明一下。
查看4道真题和解析