2013-10-08 3 views
0

Я новичок в python, и теперь у меня проблема в этой программе.Python: Linklist deque addfront & addrear

Сначала вот NodeList: < -linklist

class Node: 

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

    def getData(self): 
     return self.data 

    def getNext(self): 
     return self.next 

    def setData(self,newdata): 
     self.data = newdata 

    def setNext(self,newnext): 
     self.next = newnext 

И вот моя программа:

from NodeList import Node 
class DequeLL: 

    def __init__(self): 
     self.head = None 
     self.last = None 
     self.length = 0 

    def addFrontDLL(self, item): 
     temp = Node(str(item)) 
     temp.setNext(self.head) 
     self.head = temp 
     length = max(len(node.data) for node in self.allNodes()) if self.head else 0 
     print('\u2510{}\u250c'.format(' '*length)) 
     for node in self.allNodes(): 
      print('\u2502{:<{}}\u2502'.format(node.data, length)) 
     print('\u2514{}\u2518'.format('\u2500'*length)) 

    def addRearDLL(self, item): 
     node = Node(str(item)) 
     node.next = None 
     if self.length == 0: 
      self.head = self.last = node 
     else: 
      last = self.last 
      last.next = node 
      self.last = node 
     self.length = self.length + 1 
     length = max(len(node.data) for node in self.allNodes()) if self.head else 0 
     print('\u2510{}\u250c'.format(' '*length)) 
     for node in self.allNodes(): 
      print('\u2502{:<{}}\u2502'.format(node.data, length)) 
     print('\u2514{}\u2518'.format('\u2500'*length)) 

    def allNodes(self): 
     node = self.head 
     while node is not None: 
      yield node 
      node = node.next 

d = DequeLL() 

Все было хорошо, когда я добавить элемент в addFrontDLL. Но после добавления элемента в addRearDLL его как элемент добавляется в другой контейнер. Затем я попытался добавить с помощью addFrontDLL еще раз, и он работает так, как я хочу (элемент добавлен в этот другой контейнер). Смотрите рисунок ниже:

enter image description here

Я надеюсь, что кто-то объяснить и исправить это для меня. Любая помощь будет оценена. Спасибо.

ответ

1

Проблема заключается в том, что вы не устанавливаете поле DequeLL.last при добавлении узла с addFrontDLL спереди в первый раз. Ваш addRearDLL правильно обрабатывает добавление новых узлов, поэтому все работает после добавления в тылу.

Попробуйте это:

class DequeLL: 

    def __init__(self): 
     self.head = None 
     self.last = None 
     self.length = 0 

    def __str__(self): # Refactored for clarity 
     width = (max(len(node.data) for node in self.allNodes()) 
        if self.head else 0) # width to avoid ambiguity with self.length 
     s = ['\u2510{}\u250c'.format(' '*width)] 
     for node in self.allNodes(): 
      s.append('\u2502{:<{}}\u2502'.format(node.data, width)) 
     s.append('\u2514{}\u2518'.format('\u2500'*width)) 
     return '\n'.join(s) 

    def addFrontDLL(self, item): 
     temp = Node(str(item)) 
     temp.setNext(self.head) 
     self.head = temp 
     if self.last is None: # if adding to an empty deque, set the last node, too 
      self.last = temp 
     self.length += 1 
     print(self) # refactored the pretty-printing into __str__ for clarity 

    def addRearDLL(self, item): 
     node = Node(str(item)) 
     node.next = None 
     if self.length == 0: 
      self.head = self.last = node 
     else: 
      last = self.last 
      last.next = node 
      self.last = node 
     self.length = self.length + 1 
     print(self) 

    def allNodes(self): 
     node = self.head 
     while node is not None: 
      yield node 
      node = node.next 

Выход вашего примера теперь:

In [97]: d = DequeLL() 

In [98]: d.addFrontDLL('circle') 
┐  ┌ 
│circle│ 
└──────┘ 

In [99]: d.addFrontDLL('arc') 
┐  ┌ 
│arc │ 
│circle│ 
└──────┘ 

In [100]: d.addRearDLL('123') 
┐  ┌ 
│arc │ 
│circle│ 
│123 │ 
└──────┘ 

In [101]: d.addFrontDLL('arc') 
┐  ┌ 
│arc │ 
│arc │ 
│circle│ 
│123 │ 
└──────┘ 

In [102]: d.addFrontDLL('circle') 
┐  ┌ 
│circle│ 
│arc │ 
│arc │ 
│circle│ 
│123 │ 
└──────┘ 

In [103]: d.addRearDLL('123') 
┐  ┌ 
│circle│ 
│arc │ 
│arc │ 
│circle│ 
│123 │ 
│123 │ 
└──────┘ 
Смежные вопросы