0

さて、私は次のことをすることになっていた:

クラスノードの使用(古典的な構築)..

    class No: 
      def __init__(self, valor, prox): 
        self.valor = valor 
        self.prox = prox 

呼び出されたときに連鎖リストの2番目と3番目の文字を交換し、元のリストの最後に後方連鎖リストを追加する関数を作成します。したがって、function(list)を実行すると、lista = No(1、No(4、No(2、None)))(1> 4> 2)であり、(1> 2> 4> 4> 2> 1)が返されます。 )。

それに関する問題は、私が通常のリストに用語を追加し、そこでそれらをいじることによって問題を解決したことです。しかし、その後、チェーンリスト(上記のノードクラス)のみを使用することになっていたことがわかり、今では少し無知です...

間違った解決策のコード:

class No: 
def __init__(self, valor, prox): 
    self.valor = valor 
    self.prox = prox  


def printLista(lista):
    global lista1
    lista1 = []
    while lista:
        lista1.append(lista.valor)
        lista = lista.prox
    return lista1


def printbackwards(lista):
    global lista2
    if lista == None: return
    printbackwards(lista.prox)
    lista2.append(lista.valor)


def swapprint(lista):
    global lista1, lista2
    i = 0
    lista2 = []
    printlist(lista)
    printbackwards(lista)
    for i in range(len(lista1)):
        print lista1[i], lista2[i],



lista = No(3, No(1, No(4, No(2, None))))
swapprint(lista)
4

2 に答える 2

0

リンクリスト操作にグローバル変数を使用する必要はありません。代わりに、正しい方法で再帰し、コールスタックに値を返す必要があります。print関数は実際には何も出力しないため、何をすべきか理解できたかどうかはわかりませんが、古いリストから新しいリストを作成する場合にできることは次のとおりです。

class Node(object):
    def __init__(self, value, next=None):
        self.value = value
        self.next = next

    def __str__(self): # borrowed from Joran Beasley's answer
        return "%s->%s" % (self.value, self.next)


def reverse_linked_list(lst, tail=None):
    if lst is None:
        return tail
    else:
        return reverse_linked_list(lst.next, Node(lst.value, tail))

def swap_23_linked_list(lst):
    try:
        second = lst.next
        third = second.next
    except AttributeError: # probably lst or lst.next is None!
        raise ValueError("list is too sort to swap second and third values")

    new_third = Node(second.value, third.next) # reuse all the nodes past third!
    new_second = Node(third.value, new_third)
    new_first = Node(lst.value, new_second)

    return new_first

使用例:

>>> list_1 = Node(3, Node(1, Node(4, Node(2))))
>>> print(list_1)
3->1->4->2->None
>>> list_2 = reverse_linked_list(list_1)
>>> print(list_2)
2->4->1->3->None
>>> list_3 = swap_23_linked_list(list_2)
>>> print(list_3)
2->1->4->3->None
于 2013-03-01T01:30:00.920 に答える
0
class No:
    def __init__(self,a,b):
       self.val = a
       self.next = b
    def __str__(self):
       return "%s->%s"%(self.val,self.next)

def swapandReverse(lista):
   n2 = lista.next #2nd element
   n2.val,n2.next.val = n2.next.val,n2.val #swap 2,3
   n = lista #root node
   v = [] #hold our values
   while n.next:
      v.append(n.val) #add our value to list
      n = n.next #move to next node
   v.append(n.val) #append value of last node in the list
   while len(v): #as long as we have values left in list
      n.next = No(v.pop(-1),None) #set next to new node with our val
      n = n.next


lista = No(3,No(1,No(4,No(2,None))))
print lista
swapandReverse(lista)
print lista

少なくともそのようなもの

于 2013-03-01T01:06:59.903 に答える