1. 程式人生 > >用python實現單向鏈表

用python實現單向鏈表

單鏈表的實現 lse height 就是 單向鏈表 img 定位 ise image

單向鏈表

單向鏈表也叫單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節點,而最後一個節點的鏈接域則指向一個空值。

技術分享圖片

  • 表元素域elem用來存放具體的數據。
  • 鏈接域next用來存放下一個節點的位置(python中的標識)
  • 變量p指向鏈表的頭節點(首節點)的位置,從p出發能找到表中的任意節點。

節點的實現

class SingleNode(object):
    """單鏈表的節點"""
    def __init__(self, item):
        
# item存放數據元素 self.item = item # next是下一個節點的標識 self.next = None

測試

# 創建兩個節點
s1 = SingleNode(10)
s2 = SingleNode(12)
# 將節點2綁定到節點1的next屬性上
s1.next = s2
print(s1:, s1.item)  # s1: 10
print(s2:, s1.next.item)  # s2: 12

單鏈表的操作

  • is_empty() 鏈表是否為空
  • length() 鏈表長度
  • travel() 遍歷整個鏈表
  • add(item) 鏈表頭部添加元素
  • append(item) 鏈表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 刪除節點
  • search(item) 查找節點是否存在

單鏈表的實現

class SingleLinkList(object):
    """單鏈表"""
    def __init__(self):
        self.head = None

    def is_empty(self):
        """判斷鏈表是否為空"""
        return
self.head is None def length(self): """計算鏈表長度""" # cur初始時指向頭節點 cur = self.head count = 0 # cur指向None,說明到達了尾節點 while cur is not None: count += 1 cur = cur.next return count

遍歷鏈表

def travel(self):
   """遍歷鏈表"""
   cur = self.head
   while cur is not None:
       print(cur.item)
       cur = cur.next

頭部添加元素

 def add(self, item):
    """頭部添加元素"""
    # 創建一個保存item值的節點
    node = SingleNode(item)
    # 將新節點的鏈接域指向頭節點
    node.next = self.head
    # 將鏈表的頭head指向新節點
    self.head = node

尾部追加元素

def append(self, item):
    """尾部追加元素"""
    # 創建一個保存item值的節點
    node = SingleNode(item)
    # 先判斷鏈表是否為空,若是空鏈表,則將head指向新節點
    if self.is_empty():
        self.head = node
    # 若不為空,則找到尾部,將尾節點的next指向新節點
    else:
        cur = self.head
        # 遍歷鏈表,找到最後一個節點
        while cur.next is not None:
            cur = cur.next
        cur.next = node

在指定位置添加元素

def insert(self, pos, item):
    """在指定位置添加元素"""
    # 如果指定位置pos在第一個元素之前,則執行頭部插入
    if pos <= 0:
        self.add(item)
    # 如果指定元素超過鏈表尾部,則執行尾部插入
    elif pos > (self.length()-1):
        self.append(item)
    # 中間位置插入
    else:
        node = SingleNode(item)
        # pre_node用來指向指定位置pos的前一個節點pos-1,從頭節點開始移動到指定位置
        pre_node = self.head
        num = 0
        while num < pos - 1:
            num += 1
            pre_node = pre_node.next
        # 把新節點的鏈接域指向插入的下一個節點
        node.next = pre_node.next
        # 把插入的前一個節點的鏈接域指向新節點
        pre_node.next = node

刪除元素

def remove(self, item):
    """刪除節點"""
    cur = self.head
    pre = None
    while cur is not None:
        # 找到了指定元素
        if cur.item == item:
            # 如果第一個就是刪除的節點
            if not pre:
                # 將頭指針指向頭節點的後一個節點
                self.head = cur.next
            else:
                # 將刪除位置的前一個節點的next指向刪除位置的後一個節點
                pre.next = cur.next
            return
        else:
            # 繼續按鏈表後移節點
            pre = cur
            cur = cur.next
    else:
        raise ValueError(Can not find the item!)

查找節點是否存在

def search(self, item):
    """鏈表查找節點是否存在,並返回true或者false"""
    cur = self.head
    while cur is not None:
        if cur.item == item:
            return True
        cur = cur.next
    return False

測試

if __name__ == __main__:
    lst1 = SingleLinkList()
    lst1.append(1)
    lst1.append(a)
    lst1.add(0)
    lst1.insert(2, h)
    print(length:, lst1.length())  # length: 4
    lst1.travel()  # 0 1 h a
    lst1.remove(1)
    lst1.remove(h)
    print(length:, lst1.length())  # 2
    lst1.travel()   # 0 a
    print(lst1.is_empty())  # False

用python實現單向鏈表