华为笔试——输出单向链表中倒数第k个节点

描述

输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。

链表结点定义如下:

struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};

正常返回倒数第k个结点指针,异常返回空指针.

要求:

(1)正序构建链表;

(2)构建后要忘记链表长度。

数据范围:链表长度满足 1≤≤1000 1≤n≤1000  , ≤ k≤n  ,链表中数据满足 0≤≤10000 0≤val≤10000 

本题有多组样例输入。

输入描述:

输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值

输出描述:

输出一个整数

示例1

输入:

8
1 2 3 4 5 6 7 8
4

输出:

5

本题可以采用python面向对象的特性,通过创建node类节点和link类链表,并添加相应的构建链表、获取前置节点和最后一个节点的方法进行操作。

此外,需要注意的是,此题包含不定行输入,因此需要用while True无限循环搭配try...except...抛出输入行为空的错误来解决。

class node:
    def __init__(self,num):
        self.value=num
        self.front=None
        self.next=None

class link:
    def __init__(self):
        self.linklist=[]
    
    def add(self,node):
        if len(self.linklist)==0:
            self.linklist.append(node)
        else:
            self.linklist[-1].next=node
            node.front=self.linklist[-1]
            self.linklist.append(node)
    
    def getfront(self,node):
        if node.front is None:
            return None
        else:
            return node.front
    
    def getlastnode(self):
        return self.linklist[-1]

while True:
    try:
        length=int(input())
        if not length:
            break
        numlist=list(map(int,input().split()))
        k=int(input())
        nodelist=[node(num) for num in numlist]
        thislink=link()
        for obj in nodelist:
            thislink.add(obj)

        lastnode=thislink.getlastnode()
        for i in range(k-1):
            lastnode=thislink.getfront(lastnode)

        print(lastnode.value)
    except:
        break

你可能感兴趣的:(校招笔试真题,华为,链表,数据结构,校招)