二重リンク計
前回のシングルチェーン表に問題がありました。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)
レベルが限られています。書いたのは比較的簡単です。何か問題がありましたら、ご指摘ください。興味のある人と一緒に交流したいです。