PAT 1025 反转链表 (25 分) 测试点6非零返回解决记录

1025 反转链表 (25 分)

给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。

输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤10^​5​​ )、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。

接下来有 N 行,每行格式为:

Address Data Next

其中 Address 是结点地址,Data 是该结点保存的整数数据,Next 是下一结点的地址。

输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

---------------------------代码--------------------------------------

def ao(s):
    lst = s.split()
    fad = lst[0]
    N, K = int(lst[1]), int(lst[2])
    # 将数据都加入字典中
    i = 0
    d = {}
    ada = []
    while i < N:
        t = input()
        d[t.split(' ', 1)[0]] = t
        i += 1
    i = 0
    nxt = fad
    while i < N // K:
        yw = 0
        lst2 = []
        j = 0
        while j < K:
            lst3 = d[nxt].split(' ')
            ad = lst3[0]
            nxt = lst3[2]  # 此行代码导致测试点6非零返回, 非预期的遭遇'-1'导致, 此时应观察是否需要逆转,不需要的话,就不逆转
            lst2.append(ad)
            j += 1
            if nxt == '-1' and j < K:
                yw = 1
                break
        if yw == 0:
            j = j - 1
            while j >= 0:
                ada.append(d[lst2[j]].rsplit(' ', 1)[0])  # 先加入列表
                j -= 1
        else:  # 非预期遭遇'-1'且不满足逆转条件时不逆转
            m = 0
            while m < j:
                ada.append(d[lst2[m]].rsplit(' ', 1)[0])
                m += 1
        if nxt == '-1':
            break
        i += 1
    i = 0
    while i < len(ada) - 1:
        print(ada[i], ada[i + 1].split()[0])  # 列表中的顺序就是输出顺序,故将列表i的next就是i+1的address
        i += 1
    print(ada[i], nxt)
    # 将多出的不用反转的部分输出
    while nxt != '-1':
        print(d[nxt])
        nxt = d[nxt].split()[2]

---------------------解决过程------------------------------------------

开始该题在测试点6一直报非零返回,还没有输出返回,令人抓狂,后来我将代码一部分一部分的删除,将出错点定位到了代码中注释处。

在此处我首先怀疑是由于数据为'',导致输入为'Address Next',使得lst只有两个,取lst[2]时指针越界,但经试验后,证明不是越界的问题。

后来我想到可能是nxt取得的值在下一次循环时,无法从字典中取得,但从上一次的next指针是指向下一个数据地址的,由next指针找不到数据,这不符合题意,所以next指针应为’-1’,这样才既满足题意又导致在字典中找不到元素。所以此处应是非预期的遭遇’-1’所致,做相应处理即可。

此代码在测试点5存在运行超时问题,希望有大佬给出本代码的优化方式,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值