iT邦幫忙

0

linked list Python(以解決)

class ListNode:
  def __init__(self, data): 
    self.data = data
    # store the reference (next item)
    self.next = None
    return
  

class SingleLinkedList:
  def __init__(self): 
    self.head = None
    self.tail = None
    return

  def add_list_item(self, item):
    if not isinstance(item, ListNode):
      item = ListNode(item)
    
    if self.head is None:
      self.head = item
    else:
    #想問的部分
      self.tail.next = item
    self.tail = item
    return

  def output_list(self):

    current_node = self.head
    results = []
    
    while current_node is not None:
      results.append(current_node.data)

      # jump to the linked node
      current_node = current_node.next 

    print(results)
    return
    
list1 = SingleLinkedList()
list1.add_list_item(18)
list1.add_list_item('12')
list1.add_list_item('18')

list1.output_list()

想請教各位大大
add_list_item這個方法中
self.tail.next = item
有什麼用意
SingleLinkedList 這個類中並沒有next這個方法或變數
tail.next是什麼

froce iT邦大師 1 級 ‧ 2021-04-14 15:14:07 檢舉
就把下一個元素存進去而已啊。
add_list_item方法裡面一開始就在檢查你存進去的item type,不是的話會幫你轉換成ListNode。
你list裡面所有的元素都是ListNode,當然會有next這變數
froce大大不是要將self.tail =item
tail才會有item的屬性嗎?
froce iT邦大師 1 級 ‧ 2021-04-14 15:52:15 檢舉
你仔細看看流程,如果你的LinkedList不是空的,add_list_item才會調用self.tail.next,空的的話只會將self.head和self.tail設定為給定的node,tail只要給過list item就一定是ListNode
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
froce
iT邦大師 1 級 ‧ 2021-04-14 17:01:39
最佳解答
list1 = SingleLinkedList()
# 初始化LinkedList
# 此時 self.head、self.tail是None
#  self.head = None
#  self.tail = None

list1.add_list_item(18)
# 此時加入18這個item
# 首先會先轉換成ListNode
#  if not isinstance(item, ListNode):
#       item = ListNode(item)
# 接下來進入你有問題的if部份
#  if self.head is None:
#       self.head = item

# 然後進入沒判別的部份,把tail設定成新增的元素
#  self.tail = item
# 目前的list1長的像這樣
# [ListNode(18)],head和tail為ListNode(18)
# ListNode(18)目前data為18,next為None

list1.add_list_item('12')
# 此時加入"12"這個item
# 首先會先轉換成ListNode
#  if not isinstance(item, ListNode):
#       item = ListNode(item)
# 接下來進入你有問題的if部份,因為目前已經有head了,所以進入else部份
#       self.tail.next = item
# 目前list1長這樣
# [ListNode(18)],head和tail為ListNode(18)
# ListNode(18)目前data為18,next為ListNode("12")

# 然後進入沒判別的部份,把tail設定成新增的元素
#  self.tail = item
# 目前的list1長的像這樣
# [ListNode(18), ListNode("12")],head為ListNode(18),tail為ListNode("12")
# ListNode(18)目前data為18,next為ListNode("12"),ListNode("12")目前data為"12",next為None

list1.add_list_item('18')
# 剛上一個一樣
list1.output_list()

剛剛不在電腦前,現在這樣回好了,一步一步帶你看。

謝謝force大我看懂了 原來python中 self.變數 = 物件 代表指向這個
物件也就可以對這個物件的屬性作直接的操作

1
pepro
iT邦新手 5 級 ‧ 2021-04-14 15:57:02

就是把新的Node接在前一個node的尾巴

假設原本linked list 長這樣:
Node1(head、tail) => Null

  1. tail.item.next = item 就把 Node1的下一個指定Node2
    Node1(head、tail) => Node2 => Null
  2. self.tail = item 就是把tail丟給Node2
    Node1(head) => Node2(tail) => Null

感謝大大 解惑了

我要發表回答

立即登入回答