Отсутствует значение Python при выводе слияния в односвязный список - PullRequest
0 голосов
/ 20 января 2019

В настоящее время я пытаюсь научиться объединять два односвязных списка; однако я не могу понять, почему при вводе значения отсутствует первое значение.

Вот мой класс ..

class SinglyListNode:
    def __init__(self, data):
        self.data = data
        self.next = None

class SinglyLinkedList:
    def __init__(self):
        self.head = None

Вот код слияния, который я использую:

def mergeList(self, list):
    p = self.head 
    q = list.head
    s = None

    if not p:
        return q
    if not q:
        return p

    if p and q:
        if p.data <= q.data:
            s = p 
            p = s.next
        else:
            s = q
            q = s.next
        new_head = s 

    while p and q:
        if p.data <= q.data:
            s.next = p 
            s = p 
            p = s.next
        else:
            s.next = q
            s = q
            q = s.next
    if not p:
        s.next = q 
    if not q:
        s.next = p 
    return new_head

Это числа в массиве

  array1 = [ 3, 6, 6, 10, 45, 45, 50] ; 
  array2 = [2, 3, 55, 60 ]

А вот коды печати:

def printList(self):
    temp = self.head
    print "[",
    while temp is not None:
        print temp.data,
        temp = temp.next
    print "]"

s1.mergeList(s2)
print "Content of merged list"
s1.printList()

Вывод ...

[ 3 3 6 6 10 45 45 50 55 60 ]

Значение 2 в этом случае не распечатывается. Я попытался напечатать значение заголовка new_head в mergeList, и я получил 2.

Что я не понимаю, так это почему при печати значение 2 в начале списка исчезает.

Спасибо за помощь.

1 Ответ

0 голосов
/ 20 января 2019

Сводя ваш код к важным разделам, мы имеем:

class SinglyLinkedList:
    #...
    def mergeList(self, list):
        p = self.head 
        q = list.head
        s = None

        #...

        if p and q:
            if p.data <= q.data:
                s = p 
                p = s.next
            else:
                s = q
                q = s.next
            new_head = s

            #...

            return new_head

    #...

    s1.mergeList(s2)
    print "Content of merged list"
    s1.printList()

При объединении двух списков (и, насколько я могу судить, логика в этой функции верна), вы определяете переменную с именем new_head и затем возвращаете ее.

Но тогда, когда вы вызываете функцию с помощью:

s1.mergeList(s2)

вы «выбрасываете» возвращаемое значение. Но это возвращаемое значение было заголовком объединенного списка, поэтому, если первый элемент list [1] меньше первого элемента self, печать s1 запустит элемент «поздно».

Вместо этого рассмотрим что-то вроде изменения:

return new_head

до

self.head = new_head

И вы увидите список распечатанный, как вы ожидаете.

[1] Вы могли бы рассмотреть другое имя переменной здесь, чтобы избежать затенения встроенного типа list.

...