1. 程式人生 > >單鏈表的Python實現

單鏈表的Python實現

今天寫了一個用Python實現單鏈表,基本功能包括:從頭插入,從尾插入,查詢,刪除,構造有限佇列的插入等功能。

# -*- coding: utf-8 -*   ##允許中文註釋
'''
單向連結串列的Python實現
L = LinkList()
L.addToHead     ##從頭節點加入資料
L.addToTail     ##從尾節點加入資料
L.findTail      ##返回尾節點
L.findSize      ##返回連結串列大小
L.delete(data)  ##刪除指定節點
L.search(index) ##返回指定index的節點
L.clear()       ##清空連結串列
author: diudiu
'''
class Node():
    def __init__(self, data = None, next = None):
        self.data = data
        self.next = next

    def __str__(self):
        return 'Node [' + str(self.data) + ']'

class LinkList():
    def __init__(self):
        self.head = None
        #self.tail = None #也可以設定一個tail,這樣就不需要呼叫findTail()函式去找尾巴了
        self.size = 0
    def __str__(self):
        newNode = self.head
        s = ''
        while newNode:
            s += str(newNode.data)
            if newNode.next:                
                s += ','
            newNode = newNode.next
        return s

    def addToHead(self, data):
        newNode = Node(data, None)
        if self.head == None:
            self.head = newNode
        else:
            newNode.next = self.head
            self.head = newNode
        self.size += 1
        
    def addToTail(self, data):
        newNode = Node(data, None)
        if self.head == None:
            self.head = newNode
        else:
            tail = self.findTail()
            tail.next = newNode
        self.size += 1
        
    def findTail(self):
        curNode = self.head ##currentNode = self.head
        while curNode.next:
            curNode = curNode.next
        return curNode            
        
    def findSize(self):
        return self.size
    
    def delete(self, data):
        if self.size == 0:
            print "Can not delete from an empty list"
            return
        curNode = self.head
        preNode = None
        while curNode:
            if curNode.data == data:
                break
            else:
                preNode = curNode
                curNode = curNode.next                
        if curNode == self.head:
            self.head = self.head.next
        elif curNode == None:
            print 'Cant find the data you want delete'
        else:
            preNode.next = curNode.next

        curNode = None
        self.size -= 1           

    def insert(self, data):##將構造一個有限佇列
        newNode = Node(data, None)
        if self.size == 0:
            self.head = newNode
        else:
            curNode = self.head
            preNode = None
            while curNode:
                if curNode.data >= data:
                    break
                else:
                    preNode = curNode
                    curNode = curNode.next
            if curNode == self.head:
                newNode.next = self.head
                self.head = newNode
            else:                
                newNode.next = curNode
                preNode.next = newNode
        self.size += 1
            
        pass
    def search(self, index):
        if self.size == 0:
            print "the list is empty"
            return
        if index > self.size:
            print "the index is out of boundary"
            return
        curNode = self.head
        cnt = 1
        while curNode:
            if cnt == index:
                return curNode
            cnt += 1
            curNode = curNode.next

    def clear(self):
        self.__init__()

def test():
    L = LinkList()   
    while 1:
        data = raw_input('input data, input "q" to stop: ')
        if data == 'q':
            break
        L.insert(data)        
    print L
    
    index = raw_input('input the index:')
    print L.search(int(index))
    
    while 1:
        data = raw_input('delete data, input "q" to stop: ')
        if data == 'q':
            break
        L.delete(data)        
    print L
    


if __name__ == "__main__":
    test()