📜  门| GATE CS Mock 2018 |设置 2 |第 62 题(1)

📅  最后修改于: 2023-12-03 15:12:38.198000             🧑  作者: Mango

门| GATE CS Mock 2018 |设置 2 |第 62 题

这道题目是GATE计算机科学模拟考试2018年设置2中的第62个问题。它的主要目的是考察考生对数据结构的掌握能力和编程技巧。

题目描述

给定一个单向链表,您需要通过编写一个程序,使其返回倒数第k个节点的值。

输入格式

输入数据包含两行,第一行为链表的长度n,第二行为链表的每个节点的值。

输出格式

输出数据应包含两行,第一个应该是倒数第k个节点的值,第二个应该是整个链表(按顺序,逗号分隔)。

示例

输入:

5
1 2 3 4 5

如果您选择 k = 2,

输出:

4
1,2,3,4,5
思路

这道题目有很多种不同的解法,但它们的基本思路都相当相似。

一种不错的解法是先遍历一次链表,得到链表的长度。接着,我们再次遍历链表,跳过前n-k个元素,最后返回倒数第k个节点的值。

由于这种做法只需要遍历链表两次,它的时间复杂度是O(n),其中n是链表的长度。

代码实现

下面是一个基于Python的实现。请注意,它使用了一个称为Node的辅助类,该类用于表示链表中的节点。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None


def get_kth_node_from_end(head, k):
    length = 0
    current = head

    # get length of linked list
    while current:
        length += 1
        current = current.next

    # check if k is valid
    if k > length:
        return None

    # traverse linked list to get kth node from end
    current = head
    for i in range(length - k):
        current = current.next

    return current.data


if __name__ == '__main__':
    n = int(input())
    values = list(map(int, input().split()))

    # create linked list
    head = Node(values[0])
    current = head
    for value in values[1:]:
        current.next = Node(value)
        current = current.next

    k = int(input())
    result = get_kth_node_from_end(head, k)

    # print result
    print(result)
    current = head
    while current:
        print(current.data, end=',')
        current = current.next

使用如上代码,我们可以轻松地通过本题目。