二重リンク計


前回のシングルチェーン表に問題がありました。remove方法に間違いがありました。ここで修正しました。下にはダブルチェーンの実現です。実は、ダブルチェーンは簡単になりました。つまり、前のノードを指す参照を記憶ノードに加えました。 具体的なコードは以下の通りです
# -*- coding: cp936 -*-
#---------------------------------------------
#                                             
#author  chile                                  
#version  1.0                                
#since                                       
#date                                         
#desc                                      
#                                             
#                                             
#                                             
#---------------------------------------------
class DoubleLinkList:
    def __init__(self):
        self.root = DoubleLinkList.Entry()
        self.entry = self.root
        self.list = list()
        self.tally = 0
    
    #            
    def add(self,value):
        temp = self.Entry(pre = self.entry,value = value)
        self.entry.next = temp 
        self.entry = temp
        self.tally += 1
    
    #     
    def addFirst(self,value):
        entry = self.root.next  
        temp = self.Entry(pre = self.root , next = entry,value = value)
        self.root.next = temp  
        self.tally += 1
        
    def get(self,index):
        if index > self.tally or index < 0:
            return  #        
        mid = self.tally / 2
        e = self.root.next
        if index < mid:
            for i in range(index):
                e = e.next  
        else:
            for i in range(self.tally):
                if (i == index):
                    break
                e = e.next  
        return e.value
    
    def getLast(self):
        return self.entry.value
    
    def getFirst(self):
        return self.root.next.value
    
    def remove(self,value):
        e = self.root.next
        self.removeEntry(self.root,e, value)
        if self.isRemove:
            self.tally -= 1
                
    def removeEntry(self,pre,current,value):
        self.isRemove = False
        if current == None:
            self.isRemove = False
            return
        if current.value == value:
            pre.next = current.next
            self.isRemove = True
        else:
            self.removeEntry(current,current.next, value)    
            
    def removeFirst(self):
        root = self.root
        entry = root.next;
        root.next = entry.next
        entry.next.pre = root
        self.tally -= 1
    
    def size(self):
        return self.tally
    
    def all(self):
        self.list = list()
        self.iterator(self.root.next)
        return self.list
    
    def iterator(self,entry):
        if entry != None:
            self.list.append(entry.value)
            self.iterator(entry.next)
            
    #            ,        
    class Entry:
        
        def __init__(self, pre = None , next = None , value = None):
            self.next = next #     
            self.pre = pre   #     
            self.value = value #      
            
            

link = DoubleLinkList()
link.add(1)
link.add(2)
link.addFirst(3)
link.add(5)
link.add(4)
link.add(7)
link.remove(5)
print link.all(), link.size()
link.addFirst(5)
print link.all(), link.size()
link.removeFirst()
print link.all(), link.size()
print link.getFirst() , link.getLast() , link.get(3)
    レベルが限られています。書いたのは比較的簡単です。何か問題がありましたら、ご指摘ください。興味のある人と一緒に交流したいです。