Python的單鏈表實現

1、單向鏈表實現node

在單向鏈表結構中,每一個節點包含兩部分,元素部分和指針部分,其中元素部分即爲節點的值,指針部分指向下一個節點或者None,另外,爲了找到第一個節點,須要定義一個頭結點head,它只含有指針,即指向頭元素或者None 。數組

 

 

 

相似於數組具備的增刪查改等功能,咱們但願單向鏈表具有這些基本功能,接下來開始自定義單向鏈表的基本功能。測試

 

 

 

 

 

"""定義節點"""
class Node():
    def __init__(self, item):
        self.item = item
        self.next = None

"""定義單向鏈表"""
class SingleList():

    """將頭指針設爲鏈表的私有屬性"""
    def __init__(self, node=None):
        self.__head = node

    """判斷是否爲空"""
    def is_Empty(self):
        return self.__head == None

    """
    鏈表長度,經過遍歷得到
    須要考慮特殊狀況:鏈表爲空時是否可以正確執行
    """
    def get_length(self):
        cur = self.__head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    def traver(self):
        cur = self.__head
        while cur != None:
            print(cur.item, end=" ")
            cur = cur.next
        print()


    """
    頭部添加元素
    須要考慮特殊狀況:鏈表爲空時是否可以正確執行
    """
    def addFirst(self, item):
        node = Node(item)
        node.next = self.__head
        self.__head = node

    """
    尾部添加元素,首先須要遍歷找到最後一個元素
    須要考慮特殊狀況:鏈表爲空時是否可以正確執行
    """
    def addLast(self, item):
        node = Node(item)
        cur = self.__head
        if cur == None:
            self.__head = node
        else:
            while cur.next != None:
                cur = cur.next
            cur.next = node

    """
    在指定位置添加元素,先找到添加的位置
    須要考慮特殊狀況:在頭部和尾部以及爲空時可否正確執行
    """
    def insert(self, index, item):
        if index <= 0:
            self.addFirst(item)
        elif index >= self.get_length():
            self.addLast(item)
        else:
            node = Node(item)
            cur = self.__head
            count = 1
            while count < index:
                cur = cur.next
                count += 1
            node.next = cur.next
            cur.next = node

    """
    查找元素
    注意鏈表爲空的特殊狀況
    """
    def find(self, item):
        if self.is_Empty():
            print("鏈表爲空,沒法查找")
            return
        cur = self.__head
        i = 0
        while cur.next != None and not cur.item == item:
            cur = cur.next
            i += 1                   
        if cur.item == item:
            return("找到了,元素%s在%d處" %(item, i))
        else:
            return("沒找到")

    """
    刪除指定位置元素
    """
    def remove(self, index):
        if self.is_Empty():
            print("鏈表爲空,沒法刪除")
            return
        if index < 0 or index > self.get_length():
            print("索引越界,請檢查!")
            return
        cur = self.__head
        pre = None
        count = 0
        if index == 0:
            self.__head = cur.next
            return
        else:    
            while count != index:
                pre = cur
                cur = pre.next
                count += 1
            pre.next = cur.next
            return


if __name__ == "__main__":
    sl = SingleList()
    print(sl.is_Empty())
    sl.find(7)
    sl.insert(0,9)
    sl.traver()
    sl.addFirst(1)
    sl.traver()
    sl.addLast(2)
    sl.addLast(3)
    sl.addLast(4)
    sl.addLast(5)
    sl.addLast(6)
    sl.traver()
    sl.insert(-2, 21)
    sl.traver()
    sl.insert(20, 25)
    sl.traver()
    sl.insert(0, 15)
    sl.traver()
    sl.insert(2, 17)
    sl.traver()
    print(sl.find(7))
    print(sl.find(6))
    sl.remove(3)
    sl.traver()
    sl.remove(0)
    sl.traver()
    sl.remove(-1)
    sl.traver()
    sl.remove(20)
    sl.traver()

 

測試結果爲:優化

True
鏈表爲空,沒法查找
9
1 9
1 9 2 3 4 5 6
21 1 9 2 3 4 5 6
21 1 9 2 3 4 5 6 25
15 21 1 9 2 3 4 5 6 25
15 21 17 1 9 2 3 4 5 6 25
沒找到
找到了,元素6在9處
15 21 17 9 2 3 4 5 6 25
21 17 9 2 3 4 5 6 25
索引越界,請檢查!
21 17 9 2 3 4 5 6 25
索引越界,請檢查!
21 17 9 2 3 4 5 6 25

單鏈表基本的增刪改查等功能已基本實現,但代碼仍是有待改善優化spa

相關文章
相關標籤/搜索