单链表的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()
            


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值