struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){}
};
在这段 C++ 代码中,LinkedNode(int val):val(val), next(nullptr){}
是一个构造函数。
“LinkedNode(int val)
” 表示这是一个接受一个整数参数 val
的构造函数。
“val(val)
” 这种形式叫做成员初始化列表,它用于在对象创建时直接初始化成员变量 val
,将传入的参数 val
赋值给成员变量 val
。
“next(nullptr)
” 同样是在成员初始化列表中,将成员变量 next
初始化为 nullptr
,表示初始时链表节点的下一个节点指针为空。
在 C++ 中,null
和 nullptr
是用来表示空指针的两种不同的字面量。
-
null:
null
是 C++98 标准中引入的,用来表示空值。- 它是一个宏定义,通常被定义为
0
或者(void*)0
,这取决于编译器和平台。 - 使用
null
可能需要包含<cstddef>
头文件。
-
nullptr:
nullptr
是 C++11 标准中引入的,用来更安全、更明确地表示空指针。- 它是一个字面量,不是宏定义,并且是类型安全的。这意味着
nullptr
可以隐式转换为任何指针类型,但不能转换为非指针类型。 - 使用
nullptr
不需要包含任何特定的头文件,它是语言的一部分。
区别:
- 类型安全:
nullptr
是类型安全的,而null
不是。nullptr
可以安全地转换为任何指针类型,但null
可能需要显式类型转换。 - 可移植性:
null
可能在不同的编译器和平台上有不同的表现,而nullptr
是跨平台一致的。 - 现代性:
nullptr
是 C++11 引入的,是现代 C++ 代码的首选方式来表示空指针。
在现代 C++ 编程中,推荐使用 nullptr
而不是 null
,因为它提供了更好的类型安全和一致性。
-
MyLinkedList()
初始化MyLinkedList
对象。
LinkedList* dummyhead;
int size;
MyLinkedList() {
dummyhead=new LinkedList(0);//虚拟头节点
size=0;
}
int get(int index)
获取链表中下标为 index
的节点的值。如果下标无效,则返回 -1
int get(int index) {
if(index<0 || index>=size){
return -1;
}
LinkedList* cur=dummyhead->next;
while(index--){
cur=cur->next;
}
return cur->val;
}
-
void addAtHead(int val)
将一个值为val
的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtHead(int val) {
LinkedList* cur=new LinkedList(val);
cur->next=dummyhead->next;
dummyhead->next=cur;
size++;
}
-
void addAtTail(int val)
将一个值为val
的节点追加到链表中作为链表的最后一个元素。
void addAtTail(int val) {
LinkedList* cur=new LinkedList(val);
LinkedList* node=dummyhead;
while(node->next!=nullptr){
node=node->next;
}
node->next=cur;
size++;
}
-
void addAtIndex(int index, int val)
将一个值为val
的节点插入到链表中下标为index
的节点之前。如果index
等于链表的长度,那么该节点会被追加到链表的末尾。如果index
比长度更大,该节点将 不会插入 到链表中。
void addAtIndex(int index, int val) {
if(index>size || index<0) return ;
LinkedList* newnode= new LinkedList(val);
LinkedList* cur=dummyhead;
while(index--)
{
cur=cur->next;
}
newnode->next=cur->next;
cur->next=newnode;
size++;
}
-
void deleteAtIndex(int index)
如果下标有效,则删除链表中下标为index
的节点。
void deleteAtIndex(int index) {
if(index>=size || index<0) return ;
LinkedList* cur=dummyhead;
while(index--)
{
cur=cur->next;
}
LinkedList* temp=cur->next;
cur->next=cur->next->next;
delete temp;
temp=nullptr;
size--;
}