如何在Python中弹出链接列表

问题描述 投票:-3回答:1

我无法弄清楚为什么我的流行音乐不起作用。我尝试了多种方法,但这就是我最终登陆的方法。其他一切似乎都在起作用,但这是我遇到的唯一问题。我试图让代码在没有pos的情况下被调用时以及用pos调用它时。例如,调用pop()并调用pop(4)。 class Node:def init(self,x):self.data = x self.next = None

    def __str__(self):
        return self.data

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next

    def set_data(self, newdata):
        self.data = newdata

    def set_next(self, newnext):
        self.next = newnext


class LinkedList:

    def __init__(self):
        self.head = None

    def is_empty(self):
        return self.head == None

    def size(self):
        current = self.head
        count = 0
        while current != None:
            count = count + 1
            current = current.get_next()
        return count

    def add(self,item):
        temp = Node(item)
        temp.set_next(self.head)
        self.head = temp

    def __iter__(self):
        current = self.head
        while current is not None:
            yield current
            current = current.next

    def append(self, item):
        current = self.head
        if current:
            while current.get_next() != None:
                current = current.get_next()
            current.set_next(Node(item))
        else:
            self.head = Node(item)

    def pop(self, pos):
        prev = None
        node = self.head
        while node != None:
            prev = node
            node = node.get_next()
        if prev == None:
            self.head = node.get_next()
        else:
            prev.next = node.get_next()
python list pop
1个回答
0
投票

我做了一些更新,但我认为它正在按预期工作。除非强制性(对于任务或其他任何东西)使用getter / setter并不被视为非常Pythonic,所以我将它们从Node类中删除。让我知道您的想法以及是否需要进行任何更新。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

    def __str__(self):
        return str(self.data)


class LinkedList:
    def __init__(self):
        self.head = None

    def is_empty(self):
        return self.head is None

    def size(self):
        count = 0
        current = self.head
        while current:
            count += 1
            current = current.next
        return count

    def add(self, item):
        temp = Node(item)
        temp.next = self.head
        self.head = temp

    def __iter__(self):
        current = self.head
        while current:
            yield current
            current = current.next

    def append(self, item):
        current = self.head
        if current is None:
            self.head = Node(item)
        else:
            while current.next:
                current = current.next
            current.next = Node(item)

    def pop(self, pos=None):
        if pos is None:
            pos = self.size()
        elif pos < 0 or pos >= self.size():
            raise ValueError("Position doesn't exist")

        current_pos = 0
        prev = None
        current = self.head
        while current.next and current_pos < pos:
            prev = current
            current = current.next
            current_pos += 1
        if prev is None:
            self.head = current.next
        else:
            prev.next = current.next
        return current.data


my_linked_list = LinkedList()
assert my_linked_list.is_empty() is True
my_linked_list.add(3)
print(' -> '.join(str(node) for node in my_linked_list))

my_linked_list.add(2)
print(' -> '.join(str(node) for node in my_linked_list))

my_linked_list.add(1)
print(' -> '.join(str(node) for node in my_linked_list))

my_linked_list.append(99)
print(' -> '.join(str(node) for node in my_linked_list))

assert my_linked_list.size() == 4
assert my_linked_list.pop() == 99
print(' -> '.join(str(node) for node in my_linked_list))

assert my_linked_list.size() == 3
assert my_linked_list.pop(1) == 2
print(' -> '.join(str(node) for node in my_linked_list))

assert my_linked_list.size() == 2

安慰:

3
2 -> 3
1 -> 2 -> 3
1 -> 2 -> 3 -> 99
1 -> 2 -> 3
1 -> 3
© www.soinside.com 2019 - 2024. All rights reserved.