Leetcode707(代码随想录:设计链表)
C++代码:
遇到错误:runtime error: member access within misaligned address 0xbebebebebebebebe for type 'MyLinkedList::Node', which requires 8 byte alignment (solution.cpp)
错误含义:在错误对齐的地址 0xbebebebebebebebebebebebe 内访问 "MyLinkedList::Node "类型的成员,该类型需要 8 字节对齐
原因分析:错误含义完全没看懂,但是最后分析出的错误是重复定义了dummy_head,也就是说dummy_head的类型声明Node *只需要写一次。
经验:以后定义链表结构体的时候,在结构体中加上构造函数,方便以后创建新结点时直接赋值,并且减少野指针的产生。
class MyLinkedList {
public:
//定义链表结构体
typedef struct Node{
int val;
Node *next;
Node(int val):val(val), next(nullptr){}
};
MyLinkedList() {
dummy_head = new Node(0); //虚拟头结点
// dummy_head->val = 0;
}
int get(int index) {
int count = 0;
Node *p = dummy_head->next;
while(p != nullptr)
{
p = p->next;
count++;
}
if(index >= count || index < 0)
return -1;
else
{
p = dummy_head;
for(int i = 0; i <= index; i++)
{
p = p->next;
}
return p->val;
}
}
void addAtHead(int val) {
Node *p = new Node(val);
// p->val = val;
p->next = dummy_head->next;
dummy_head->next = p;
}
void addAtTail(int val) {
Node *p = dummy_head;
while(p->next != nullptr)
p = p->next;
Node *q = new Node(val);
// q->val = val;
q->next = nullptr;
p->next = q;
}
void addAtIndex(int index, int val) {
int count = 0;
Node *p = dummy_head->next;
while(p != nullptr)
{
p = p->next;
count++;
}
if(index >= 0 && index <= count)
{
p = dummy_head;
for(int i = 0; i < index; i++)
{
p = p->next;
}
Node *q = new Node(val);
// q->val = val;
q->next = p->next;
p->next = q;
}
}
void deleteAtIndex(int index) {
int count = 0;
Node *p = dummy_head->next;
while(p != nullptr)
{
p = p->next;
count++;
}
if(index >= 0 && index < count)
{
p = dummy_head->next;
Node *q = dummy_head;
for(int i = 0; i < index; i++)
{
p = p->next;
q = q->next;
}
q->next = p->next;
delete p;
}
}
private:
Node *dummy_head;
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
Python代码:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class MyLinkedList:
def __init__(self):
self.dummy_head = ListNode()
self.size = 0
def get(self, index: int) -> int:
if index < 0 or index > self.size-1:
return -1
else:
p = self.dummy_head.next
while index:
p = p.next
index -= 1
return p.val
def addAtHead(self, val: int) -> None:
p = ListNode(val, self.dummy_head.next)
self.dummy_head.next = p
self.size += 1
def addAtTail(self, val: int) -> None:
p = self.dummy_head
for i in range(self.size):
p = p.next
p.next = ListNode(val)
self.size += 1
def addAtIndex(self, index: int, val: int) -> None:
if index >= 0 and index <= self.size:
p = self.dummy_head
for i in range(index):
p = p.next
p.next = ListNode(val, p.next)
self.size += 1
def deleteAtIndex(self, index: int) -> None:
if index >= 0 and index < self.size:
p = self.dummy_head
for i in range(index):
p = p.next
p.next = p.next.next
self.size -= 1
# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)