51 输出单向链表中倒数第k个结点

本文深入探讨了如何通过单向链表寻找倒数第K个结点的有效算法。提供了详细的链表结点定义及算法实现代码,包括直接列表实现和链表形式实现。此外,还附带了输入输出示例,帮助读者更好地理解并应用这一算法。

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

链表结点定义如下:

struct ListNode

{

int m_nKey;

ListNode* m_pNext;

};
详细描述:
接口说明
原型:
ListNode* FindKthToTail(ListNode* pListHead, unsignedint k);
输入参数:
ListNode* pListHead 单向链表
unsigned int k 倒数第k个结点
输出参数(指针指向的内存区域保证有效):

返回值:
正常返回倒数第k个结点指针,异常返回空指针
输入描述:
输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值
输出描述:
输出一个整数
示例1
输入
8
1 2 3 4 5 6 7 8
4
输出
5

#直接列表实现
while True:
    try:
        n=int(input())
        stringlist=[int(i) for i in input().split()]
        index=int(input())
        if index==0:
            print(0)
        else:
            print(stringlist[-index])
    except:
        break
#链表形式
class Node():
    def __init__(self,item):#节点初始条件有值
        self.item=item
        self.next=None

#创建链表的类
class SingleLink():
    #初始化,给定链表的头部属性
    def  __init__(self,node=None):
        self.__head=node
    def is_empty(self):
        return self.__head==None #为None返回True,不为None,False
    def append(self,newitem):
        newnode=Node(newitem)
        if self.is_empty():#类之间的函数调用用self.func
            self.__head = newnode
        else:
            currentnode=self.__head
            while currentnode.next!=None:
                currentnode=currentnode.next
            currentnode.next = newnode
    # #判断链表的长度
    def length(self):
        if self.is_empty():
            return 0
        else:
            currentnode=self.__head #代表currentnode指向当前节点的游标与head指针指向同一个节点
            lengthcount=1#对比注释部分另一个方法,lengthcount=0
            while currentnode.next!=None:
                lengthcount+=1
                currentnode=currentnode.next
            return lengthcount

    def show(self, position):
        if (position < 0) or (position > self.length()):
            return False
        else:
            currentnode = self.__head
            positioncount = 0
            while positioncount < position:
                currentnode = currentnode.next

                positioncount += 1
            print(currentnode.item)
while True:
    try:
        if __name__ == "__main__":
            link = SingleLink()
            n=int(input())
            stringlist=[int(i) for i in input().split()]
            for i in stringlist:
                link.append(i)
            index=int(input())
            if index==0:
                print(0)
            else:
                link.show(n-index)
    except:
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值