1133. Splitting A Linked List (25)

题目详情:https://www.patest.cn/contests/pat-a-practise/1133

这道题关键在与”链表”的访问和输出的空值。我一开始按照链表的输入顺序进行输出导致出错。
我用Pyhon写的,容易导致一些莫名其妙的错误,建议还是用C,C++写吧。用Python写得控制输入输出。但是在Mac上写,C、C++的输入又成问题了,只能在命令行下一遍遍的手动输。另外Pyhon运行较慢

#-*— coding:utf-8 -*-
def solution():
    fnk=raw_input().split(" ")
    firstAdress=fnk[0];n=int(fnk[1]);k=int(fnk[2])
    if n==0:#链表的节点个数为0,则直接返回
        return
    negative=[];greater=[];ok=[];mapping={}#negative存储负数,greater存储大于k的数,ok存储在[0,k]之间的数
    for i in range(n):
        avn=raw_input().split(" ")#处理输入
        mapping[avn[0]]=avn#按照地址存储在map中
    nextAdress=firstAdress#从链表中的第一个节点开始遍历“链表”
    while nextAdress!='-1':
        avn=mapping[nextAdress]
        val=int(avn[1])#分开存储节点中的值
        if val<0:
            negative.append(avn)
        elif val>k:
            greater.append(avn)
        else:
            ok.append(avn)
        nextAdress=avn[2]#赋值为下一个节点的值
    negativelength=len(negative);oklength=len(ok);greaterlength=len(greater)#得到个节点的长度
    if negativelength!=0:#先输出负数
        i=0
        while i<negativelength-1:
            print negative[i][0],negative[i][1],negative[i+1][0]
            i+=1
        if oklength==0 and greaterlength==0:#如果只有负数的情况
            print negative[i][0],negative[i][1],"-1"
        elif greaterlength!=0 and oklength==0:#没有在[0,k]中的数
            print negative[i][0],negative[i][1],greater[0][0]
        else:#其它情况下,即ok数组的长度不为0的情况
            print negative[i][0],negative[i][1],ok[0][0]
    if oklength!=0:#输出[0,k]之间的数
        i=0
        while i<oklength-1:
            print ok[i][0],ok[i][1],ok[i+1][0]
            i+=1
        if greaterlength==0:#如果greaterlength为空的话
            print ok[i][0],ok[i][1],"-1"
        else:#greaterlength不为0
            print ok[i][0],ok[i][1],greater[0][0]
    if greaterlength!=0:#输出大于k的数
        i=0
        while i<greaterlength-1:
            print greater[i][0],greater[i][1],greater[i+1][0]
            i+=1
        print greater[i][0],greater[i][1],'-1'
solution()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值