python实现双链表

    学习数据结构,以前一头雾水的东西现在很清晰了。双链表的实现,包含了增删改查反序等基本操作

# -*- coding: utf-8 -*-
'''
###############################   Meet33 double linklist
'''
class Node(object):
    def __init__(self,val,n=None,p=None):
        self.data = val
        self.next = n
        self.prev = p
    def get_next(self):
        return self.next
    def get_prev(self):
        return self.prev
    def set_next(self, n):
        self.next = n
    def set_prev(self, p):
        self.prev = p
    
class LinkList(object):
    def __init__(self):
        self.head = None
        self.last = None
        self.length = 0
    
    def __getitem__(self, ind):
        if self.is_empty():
            print('linklist is empty!')
            return
        elif ind < 0 or ind > self.get_length():
            print('this key is not exist!')
            return
        else:
            return self.getitem(ind)
    
    def __setitem__(self, ind, value):
        if self.is_empty():
            print('linklist is empty!')
            return
        elif ind < 0 or ind > self.get_length():
            print('this key is not exist!')
            return
        else:
            self.delete(ind)
            return self.insert(ind, value)
    
    def initlist(self,data):
        if len(data) <= 0:
            print('data is empty!')
            return
        self.head = Node(data[0])
        self.head.set_prev(None)
        p = self.head
        node = None
        for i in data[1:]:
            node = Node(i)
            p.set_next(node)
            node.set_prev(p)
            #p.next = node
            #node.prev = p
            p = p.get_next()
            #p.set_prev()
        self.last = node
        self.length = len(data)
    
    def get_length(self):
        return self.length
    
    def is_empty(self):
        if self.get_length() == 0:
            return True
        else:
            return False
    
    def clear(self):
        self.head = None
        self.last = None
        self.length = 0
    
    def append(self, item):
        q = Node(item)
        if self.head is None:
            self.head = q
            self.last = q
        else:
            p = self.head
            while p.next is not None:
                p = p.next
            p.next = q
            q.prev = p
            self.last = q
            q.set_next(None)
        self.length += 1
        
    def getitem(self, index):
        index = int(index)
        if self.is_empty():
            print('linklist is empty!')
            return
        if index > self.length - 1 or index < 0:
            print('index error!')
            return
        j = 0
        p = self.head
        while p.next != 0 and j < index:
            p = p.next
            j += 1
        if j == index:
            return p.data
        else:
            print('target is not exist!')
    
    def insert(self,index,item):
        index = int(index)
        if item is None:
            print('item cant be None!')
            return
        if self.is_empty() or index < 0 or index > self.get_length() - 1:
            print('index error or linklist is empty')
            return
        if index == 0:
            h = self.head
            q = Node(item)
            self.head = q
            self.head.set_prev(None)
            self.head.set_next(h)
                
        p = self.head
        post = self.head
        j = 0
        while p.next is not None and j < index:
            post = p
            p = p.next
            j += 1
        if index == j:
            q = Node(item)
            post.next = q
            q.prev = post
            q.next = p
            p.prev = q
        
        self.length += 1
        
    def delete(self, index):
        if self.is_empty() or index < 0 or index > self.length - 1:
            print('index error or linklist is empty')
            return
        if index == 0:
            if self.length == 1:
                self.head = None
                self.last = None
                self.length = 0
                print('now linklist is empty')
            else:
                h = self.head
                self.head = Node(h.next.data)
                self.head.set_next(h.get_next().get_next())
                self.head.set_prev(None)
                h.next.set_prev(self.head)
                self.length -= 1
                print('delete head')
            return
            
        p = self.head
        post = self.head
        j = 0
        while p.next is not None and j < index:
            post = p
            p = p.next
            j += 1
        if index == j:
            if p.next is None:
                print('delete last')
                post.next = None
                self.last = post
            else:
                post.next = p.next
                p.next.prev = post
        self.length -= 1
        
    def get_index(self, value):
        if self.is_empty():
            print('linklist is empty!')
            return
        p = self.head
        j = 0
        while p.next is not None and p.data != value:
            p = p.next
            j += 1
        if p.data == value:
            return j
        else:
            return -1
    
    def show(self):
        if self.is_empty():
            print('linklist is empty!')
            return
        print('LL =',end=' ')
        p = self.head
        leng = self.get_length()
        for i in range(leng):
            if i < leng - 1:
                print(p.data,end=',')
            else:
                print(p.data)
            p = p.get_next()
    
    def reverse(self):
        # only need to change the Nodes' atttibutes, then change the head as end Node, over 
        if self.is_empty():
            print('linklist is empty!')
            return
        h = self.head
        h0 = self.head
        nextNode = self.head.get_next()
        #temp = Node(1)
        while nextNode is not None:
            temp = nextNode.get_next()
            nextNode.set_next(h)
            h.set_prev(nextNode)
            h = nextNode
            nextNode = temp
        self.head.next = None
        self.head = h
        self.last = h0
        self.last.set_next(None)
            
if __name__ == '__main__':
    import time
    l0 = LinkList()
    l0.show()
    temp = [1,2,'3',4,5,{"a":6},7,8]
    l0.initlist(temp)
    l0.show()
    l0.delete(2)
    l0.show()
    l0.insert(2,33)
    l0.show()
    l0.__setitem__(2,3)
    l0.show()
    
    t0 = time.time()
    for i in range(9999):
        #print('i=',i)
        l0.reverse()
    t1 = time.time()
    t2 = t1 - t0
    l0.show()
    
    print('l0.head.data=',l0.head.data)
    print('l0.last.data=',l0.last.data)
    print('after delete index 0:',end=' ')
    l0.delete(0)
    l0.show()
    print('after delete last:',end=' ')
    end = l0.get_index(l0.last.data)
    l0.delete(end)
    l0.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值