Python中的内存编辑。删除LinkedList中的最后一个节点

时间:2018-04-18 19:29:37

标签: python python-3.x memory-management

从破解编码面试。任务2.3。

您有链接列表,您需要创建一个只接受该列表中的节点的函数,并将其从该列表中删除。

当节点位于中间时,它很简单。您只需将字段valuenext重新分配给列表中的下一个节点即可。但是如何摆脱列表中的最后一个节点?

我一直在寻找一种在Python中修改内存的方法,但是找不到任何实际可行的方法。任何人都可以提出任何建议吗?

以下是代码:

class LinkedListNode:
    def __init__(self, item, next = None):
        self.item = item
        self.next = next


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

    def append(self, item):
        self.__head = LinkedListNode(item, self.__head)

    @property
    def head(self):
        return self.__head

def remove_node(node):
    if node.next:
        next = node.next
        node.item = next.item
        node.next = next.next
        next.next = None
    else:
        # WHAT TO DO HERE?
        pass

1 个答案:

答案 0 :(得分:0)

在使用C ++实现之后,我意识到了以下几点。

想象一下,你有3个元素的列表:3 - > 2 - > 1。

我们要删除包含值1的最后一个节点。如果我们使用C ++代码并检查我们的元素发生了什么,我们将看到节点321中存储的内容:

3: 48416413-411270030000000
2: 32416413-411270020000000
1: 0000000010000000

我们可以看到每个节点都有一个next指针和一个data值。最后一个节点有一个next指针。所以,为了做我想做的事情,我们需要先到最后一个节点并将它的指针设置为0x0(NULL指针)。这意味着无论是在C ++上还是在Python当前实现都是不可能的,除非有办法找到指向内存插槽的指针。

请参阅下面的C ++实现。

#include <iostream>
#include <string>
using namespace std;

class Node
{
    public:
    Node* next;
    int data;
};

class List
{
    private:
    Node *head;

    public:
    List()
    {
        head = NULL;
    }

    Node* get_head() { return head; }

    void append(int val) {
        Node* newHead = new Node();
        newHead->data = val;
        newHead->next = head;
        head = newHead;
    }
}

int main() {
    List* list = new List();
    list->append(1);
    list->append(2);
    list->append(3);

    cout << "List: " << list->str() << "\n";

    Node* node = list->get_head();
    while (node) {
        cout << node->data << ": ";
        string str(reinterpret_cast<char*>(node), sizeof(*node));
        for(string::iterator it = str.begin(); it != str.end(); ++it) {
            int i = *it;
            cout << i;
        }
        cout << "\n";

        node = node->next;
    }

    cout << "List: " << list->str() << "\n";

    return 0;
}