3

二重連結リストクラスを作っています。

def remove(self, item):
    current=self.__head
    prev=None
    found=False
    if(self.__size>=1):
        for i in range (0,self.__size):
            if(current.getData()==item):
                found=True
                pos=i#save the position to pop
                i=self.__size#leave the loop
            else:
                prev=current
                current=current.getNext()

        if(found==True):#excute only if the item is found
            if(prev==None):#first item found
                if(self.__size==1):
                    self.__head==None
                    self.__tail==None
                    current.setNext(None)
                    current.setPrevious(None)
                else:#size bigger than 2
                    self.__head==current.getNext()
                    current.setNext(None)
            else:
                if(current.getNext()==None):#last item found
                    self.__tail==prev
                    current.setPrevious(None)
                    prev.setNext(None)
                else:
                    Next=current.getNext()
                    current.setNext(None)
                    current.setPrevious(None)
                    Next.setPrevious(prev)
                    prev.setNext(Next)
            self.pop(pos)
            self.__size-=1

これは私がこれまでに行ったことです。以下のコードを実行すると

 for i in range(0, 10):
    int_list2.add(i)
    int_list2.remove(1)
    int_list2.remove(3)
    int_list2.remove(2)
    int_list2.remove(0)
    print(int_list2)

これらは私が得る出力です

0

1

2

3

4 3

5 4 3

6 5 4 3

7 6 5 4 3

8 7 6 5 4 3

9 8 7 6 5 4 

最初の 4 行 (0~3) には何も表示されず、5 行目から 4、6 行目から 5 4 などと予想されます。

最後に欲しい 9 8 7 6 5 4

コードを修正するにはどうすればよいですか?

4

1 に答える 1

2

問題の一部は、for ループの if ステートメントの最初の部分にあります。

for i in range (0,self.__size):
        if(current.getData()==item):
            found=True
            pos=i#save the position to pop
            i=self.__size#<--- doesn't leave the loop 
        else:
            prev=current
            current=current.getNext()

設定i=self.__sizeはループを抜けません。break代わりに使用してください。

これにより、アイテムが見つかったときにループを反復し続け、current削除したいアイテムではなくなります。代わりcurrentに、for ループで確認する最後のノードの値です。

また、これらの行で==割り当てを意味していると確信しているときに使用しています:=

self.__head==None   #should be self.__head=None
self.__tail==None   #should be self.__tail=None
current.setNext(None)
current.setPrevious(None)

==を単一の に変更し=ます。私はあなたのif(found==True):ブロックでそれを数回行うと思います。これらの行は、ブール式を評価して値を捨てているだけです。

それらを変更して、それで問題が解決するかどうか教えてください。

また、ちょっとしたヒント:

ブール変数 ( など) がある場合は、 と同じ値に評価されるため、foundチェックする必要はありません。すなわち:found==Truefound

if(found==True):
   ...

以下と同じです:

if(found):
   ...
于 2013-03-07T02:35:39.737 に答える