题解 | #输出单向链表中倒数第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开始遍历的。实际效果使用是正常的,就是注明一下。
查看5道真题和解析