蟒蛇;链接列表和遍历!

时间:2010-08-26 13:55:00

标签: python linked-list traversal

现在开始在学校用python编程,我不知道如何处理这个问题。有什么想法吗?

输入由换行符分隔整数组成。您的程序应该在链表中提交它们,遍历链表并打印最高编号。

取一个第一个数字,然后做一个动作,说“如果下一个数字更大,那么拿一个,否则保持当前数字,然后在列表中重复”并重复“

然后当它到达列表的末尾时,它会打印出它拥有的值。

from sys import stdin

class Kubbe:
    vekt = None
    neste = None
    def __init__(self, vekt):
        self.vekt = vekt 
        self.neste = None 

def spor(kubbe):
    # WRITE YOUR CODE HERE
    # Creates linked list
    forste = None
    siste = None
    for linje in stdin:
        forrige_siste = siste
        siste = Kubbe(int(linje))
        if forste == None:
            forste = siste
        else:
            forrige_siste.neste = siste

# Calls the solution function and prints the result
print spor(forste)

输入:示例

54
37
100
123
1
54

必需的输出

123

5 个答案:

答案 0 :(得分:5)

“链接列表”在Python中很少使用 - 通常,只使用list,Python内置列表,实际上更像是一个“动态矢量”。因此,将链接列表指定为练习约束的一部分是很奇怪的。

但重点是,您显示的代码已经创建链接列表 - 头部位于forste,并且,对于每个节点,下一个节点.neste处的指针,.vekt处的有效负载。所以,大概,不管你的问题是什么,这都不是你所要求的。

完全构建链接列表后(即在spor的当前代码末尾)循环遍历链接列表的简单方法是

current = forste
while current is not None:
   ...process current.vekt...
   current = current.neste

在您的情况下,“过程”部分的逻辑当然是正如您的Q的文字已经说明的那样:

   if current.vekt > themax:
       themax = current.vekt

唯一的细微之处在于,您需要在此themax循环之前将while初始设置为“尽可能最低的数字”;在Python的最新版本中,“负无穷大”被可靠地记录和比较(尽管只是作为一个浮点数,它仍然可以正确地与整数进行比较),所以

themax = float('-inf')

会奏效。更优雅的可能是最初将最大值设置为第一个有效负载,避免弄乱无穷大。

答案 1 :(得分:1)

这是基于您自己的代码和语言的答案。很抱歉,如果新的变量和函数名称转换不好,因为我不会说挪威语(Google Language Tools是我的朋友)。

评论:与飞机空中交通管制一样,大多数国际编程论坛(如StackOverflow)的默认语言为英语。如果你使用它,你可能会得到更快,更好,更多的答案 - 它可能使问题和相关答案对其他人最多有用。只是我的2øre...; - )

from sys import stdin

class Kubbe:
    vekt = None
    neste = None
    def __init__(self, vekt):
        self.vekt = vekt
        self.neste = None

def spor():
    # WRITE YOUR CODE HERE
    # Creates linked list
    forste = None
    siste = None
    while True:
        try:
            linje = raw_input()
        except EOFError:
            break
        forrige_siste = siste
        siste = Kubbe(int(linje))
        if forste == None:
            forste = siste
        else:
            forrige_siste.neste = siste
    return forste

def finne_maksimal(lenketliste):
    storste = None
    if lenketliste is not None:
        storste = lenketliste.vekt
        gjeldende = lenketliste.neste
        while gjeldende is not None:
            if gjeldende.vekt > storste:
                storste = gjeldende.vekt
            gjeldende = gjeldende.neste
    return storste

lenketliste = spor()
storste = finne_maksimal(lenketliste)
if lenketliste is None:
    print "tom liste"
else:
    print "storste er", storste

答案 2 :(得分:0)

Python中有一个名为reduce的内置函数,它遍历一个列表并用给定的函数“压缩”它。也就是说,如果您有五个元素[a,b,c,d,e]和一个函数f的列表,它将有效地执行

temp = f(a,b)
temp = f( temp, c )
...

您应该能够使用它来编写非常简洁的解决方案。

如果你想减少抽象,你需要依次遍历列表中的每个元素,将最大的数字存储到变量中。仅当您到达的元素大于所述变量的值时才更改变量。

答案 3 :(得分:0)

这似乎适用于您的输入(在python 2和3中都有效)。注意max如何使用Python的鸭子输入!

此版本也可以从文件中使用Python3。

import sys
class Kubbe:
    vekt = None
    neste = None
    def __init__(self, vekt):
        self.vekt = vekt 
        self.neste = None 

def spor():
    # WRITE YOUR CODE HERE
    # Creates linked list
    forste = None
    siste = None
    while True:
        linje = sys.stdin.readline().rstrip()
        if not linje:
            break

        forrige_siste, siste = siste, Kubbe(int(linje))
        if forste is None:
            forste = siste
        else:
            forrige_siste.neste = siste
    return forste

def traverse(linkedlist):
    while linkedlist is not None:
        yield linkedlist.vekt
        linkedlist=linkedlist.neste

# Calls the solution function and prints the result
linkedlist=spor()

for item in traverse(linkedlist):
    print(item)

# use builtin max:
print('Maximum is %i' % max(traverse(linkedlist)))
# if not allowed:
m = linkedlist.vekt
for item in traverse(linkedlist.neste):
       if item > m:  m = item 
print(m)

答案 4 :(得分:0)

以下代码将起作用。 Node类表示LinkedList节点。 LinkedList类定义在链接列表的末尾添加节点的方法,find_max将遍历列表并返回具有最大键的节点。

   class Node(object):
        def __init__(self, key, next_node):
            self.key = key 
            self.next_node = next_node

    class LinkedList(object):
        def __init__(self):
            self.head = None

        def append(self, key):
            # Create a new Node
            new_node = Node(key, None)
            if (self.head == None):
                self.head = new_node
            else:
                tmp = self.head
                while(tmp.next_node != None):
                    tmp = tmp.next_node
                tmp.next_node = new_node

        def find_max(self):
            tmp = self.head
            max_num = 0 
            while(tmp != None):
                if (tmp.key > max_num):
                    max_num = tmp.key
                tmp = tmp.next_node
            return max_num