2013-03-11 38 views
0

所以我一直在嘗試插入一個項目到鏈接列表的前面,它有點作品,但並不完全。以下是我迄今爲止(也有在LinkedList類更多的方法,但我忽略他們,因爲他們不是一個問題):將項目插入鏈表的前面? python

class _Node(): 
    def __init__(self, data=None, link=None): 
     self.data = data 
     self.link = link 

class LinkedList(): 
    def __init__(self): 
     self.first = None 
     self.size = 0 

    def insert(self, ind, item): 
     if self.first is None: 
      self.first = _Node(item) 
     elif ind == 0:     # this is where the problem is. When I try to 
      temp = self.first   # insert a node to the front, it seems to 
      temp.link = self.first.link # forget about the rest of the nodes. 
      self.first = _Node(item) 
      self.first.link = temp 
     else: 
      count = 0 
      while count != ind - 1: 
       count += 1 
       self.first = self.first.link 
      self.first.link = _Node(item, self.first.link) 
     self.size += 1 

說我有這個殼:

>>> L = LinkedList() 
    >>> L.insert(0, 5) 
    >>> L.insert(1, 10) 
    >>> L.insert(0, 20) 
    >>> L[0] 
    20 
    >>> L[1] 
    5 
    >>> L[2] 
    # and here is an error message, it says NoneType object has no attribute 'data' 

所以在我上面的代碼中,我想要做的是創建一個與第一個節點對象相同的臨時節點對象,我將該臨時節點鏈接到第一個節點鏈接,創建新節點,然後將新的節點到臨時的,但這不起作用。 任何幫助將是偉大的,謝謝!

+0

爲什麼不使用內置數據結構? – linbo 2013-03-11 07:22:22

+0

你是什麼意思?我是編程新手,我正在做這個檢查測試。 – peppy 2013-03-11 07:26:22

+0

我的意思是蟒蛇已經有鏈接列表庫 – linbo 2013-03-11 07:28:19

回答

2

它好像你離開了,因爲他們「沒有問題」的功能,實際上可能是你的問題......如果你在這個每個節點索要數據

你的代碼工作方式:

>>> L = LinkedList() 
>>> L.insert(0,5) 
>>> L.insert(1,10) 
>>> L.insert(0,20) 
>>> print L.first.data 
20 
>>> print L.first.link.data 
5 
>>> print L.first.link.link.data 
10 

你可能有一個問題,你在定義__getitem__。此外,您評論的部分可以重寫成一行,這可能會更加Pythonic。

temp = self.first 
temp.link = self.first.link 
self.first = _Node(item) 
self.first.link = temp 

前兩行什麼也不做,因爲tempself.first所以你說的是self.first.link = self.first.link。接下來的兩個可以寫成:

self.first = _Node(item, self.first) 
0

首先,注意你其實並不需要特殊情況下的空單位置:

def insert(self, ind, item): 
    if ind == 0: 
     newnode = _Node(item, self.first) 
     self.first = newnode 

其次,這是沒有問題的。此代碼:

else: 
     count = 0 
     while count != ind - 1: 
      count += 1 
      self.first = self.first.link 
     self.first.link = _Node(item, self.first.link) 
    self.size += 1 

改變的地方 self.first,所以忘記什麼的第一個節點是以前。修復此問題的最小更改爲:

else: 
     count = 0 
     insert_point = self.first # use a local variable to walk the list 
     while count != ind - 1: 
      count += 1 
      insert_point = insert_point.link 
     insert_point.link = _Node(item, insert_point.link) 
    self.size += 1