从破解编码面试。任务2.3。
您有链接列表,您需要创建一个只接受该列表中的节点的函数,并将其从该列表中删除。
当节点位于中间时,它很简单。您只需将字段value
和next
重新分配给列表中的下一个节点即可。但是如何摆脱列表中的最后一个节点?
我一直在寻找一种在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
答案 0 :(得分:0)
在使用C ++实现之后,我意识到了以下几点。
想象一下,你有3个元素的列表:3 - > 2 - > 1。
我们要删除包含值1
的最后一个节点。如果我们使用C ++代码并检查我们的元素发生了什么,我们将看到节点3
,2
和1
中存储的内容:
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;
}