【问题标题】:singly linked list in python remove functionpython删除函数中的单链表
【发布时间】:2020-04-19 11:46:28
【问题描述】:
class Node:
    def __init__(self, key=None):
        self.key = key
        self.next = None
    def __str__(self):
        return str(self.key)

class SinglyLinkedList:
    def __init__(self):
        self.head = None
        self.size = 0

    def __len__(self):
        return self.size

    def printList(self):
        v = self.head
        while(v):
            print(v.key, "->", end=" ")
            v = v.next
        print("None")


    def pushFront(self, key):
        new_node = Node(key)
        new_node.next = self.head
        self.head = new_node            
        self.size += 1

    def pushBack(self, key):
        new_node = Node(key)
        if self.size == 0:  # empty list --> new_node becomes a head!
            self.head = new_node
        else:
            tail = self.head
            while tail.next != None:    # follow links until tail
                tail = tail.next
            tail.next = new_node
        self.size += 1
    def popFront(self): 
        key = None
        if len(self) > 0:
            key = self.head.key
            self.head = self.head.next
            self.size -= 1
        return key
    def popBack(self):
        if self.size == 0:  # empty list (nothing to pop)
            return None, None
        else:
            previous, current = None, self.head
            while current.next != None:
                previous, current = current, current.next   
            tail = current
            key = tail.key
            if self.head == tail:   # 또는 if previous == None:
                self.head = None
            else:
                previous.next = tail.next   # previous가 새로운 tail이 됨!
            self.size -= 1
            return key
    def search(self, key):
        v = self.head
        while v:
            if v.key == key:
                return v
            v = v.next
        return None     # key 값을 저장된 노드 리턴. 없으면 None 리턴

    def remove(self, v):
        if self.head == None or v == None:
            return
        else: 
            if v == self.head:
                self.head=v.next
            else:
                prev == self.head
                while prev != None:
                    prev == prev.next
                prev.next = v.next
                del v

    def size(self):
        return self.size

    L = SinglyLinkedList()
    while True:
        cmd = input().split()
        if cmd[0] == "pushFront":
            L.pushFront(int(cmd[1]))
            print(int(cmd[1]), "is pushed at front.")
        elif cmd[0] == "pushBack":
            L.pushBack(int(cmd[1]))
            print(int(cmd[1]), "is pushed at back.")
        elif cmd[0] == "popFront":
            x = L.popFront()
            if x == None:
                print("List is empty.")
            else:
                print(x, "is popped from front.")
        elif cmd[0] == "popBack":
            x = L.popBack()
            if x == None:
                print("List is empty.")
            else:
                print(x, "is popped from back.")
        elif cmd[0] == "search":
            x = L.search(int(cmd[1]))
            if x == None:
                print(int(cmd[1]), "is not found!")
            else:
                print(int(cmd[1]), "is found!")
        elif cmd[0] == "remove":
            x = L.search(int(cmd[1]))
            if L.remove(x):
                print(x.key, "is removed.")
            else:
                print("Key is not removed for some reason.")
        elif cmd[0] == "printList":
            L.printList()
        elif cmd[0] == "size":
            print("list has", len(L), "nodes.")
        elif cmd[0] == "exit":
            print("DONE!")
            break
        else:
            print("Not allowed operation! Enter a legal one!")

我正在尝试在 Python 中创建单链表。我的代码运行良好,但仅 remove() 函数本身根本不起作用。我知道我在 remove 中要做的就是做两种情况,一种是当值是头节点时,另一种是当它不是头节点时。我尽力了,但我仍然不知道我的代码哪里出错了。你能帮帮我吗?

【问题讨论】:

  • + 我的删除功能是删除特定节点
  • remove 方法中的循环跟随列表直到它结束,但它应该这样做直到找到要删除的节点。
  • while prev != None: AND prev != v 或类似的东西 - 没有考虑太多 - 把它作为查看位置的指针

标签: python singly-linked-list


【解决方案1】:

我已经修改了remove() 函数并且它起作用了:

def remove(self, v):
    if self.head == None or v == None:
        return False
    else:
        if v == self.head:
            self.head = v.next
        else:
            prev = self.head
            while prev.next != v:
                prev = prev.next
            prev.next = v.next
            del v
        return True

希望这会有所帮助:)

在此处查看此屏幕截图: Screenshot

【讨论】:

  • 非常感谢,但它仍然无法正常工作......我想我需要在第一个“if”句子中给出 False。我说的对吗?
  • 更新了我的答案。请再次检查。
  • 仍然无法正常工作,更糟糕的是甚至没有错误...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多