一 203 移除链表元素
在链表中设置一个虚拟头结点dummyhead可以有效避免头结点需要特殊处理的情况
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyhead = new ListNode(0,head);
ListNode* cur = dummyhead;
while(cur != NULL&&cur->next != NULL){
if(cur->next->val == val){
ListNode * p = cur->next;
cur->next = cur->next->next;
delete(p);
}
else{
cur = cur->next;
}
}
return dummyhead->next;
}
};
二 707 设计链表
链表的设计有助于从整体上理解链表
class MyLinkedList {
public:
struct ListNode {
int val;
ListNode* next;
ListNode(int val):val(val), next(nullptr){}
};
MyLinkedList() {
dummyhead = new ListNode(0);
size = 0;//表示链表中有多少元素
}
int get(int index) {
if(index < 0||index >= size ){
return -1;
}
ListNode*cur = dummyhead->next;
while(index--){
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
ListNode* newhead = new ListNode(val);
newhead->next = dummyhead->next;
dummyhead->next = newhead;
size++;
}
void addAtTail(int val) {
ListNode* p = dummyhead;
while(p->next != nullptr){
p = p->next;
}
ListNode*newtail = new ListNode(val);
p->next = newtail;
size++;
}
void addAtIndex(int index, int val) {
if(index < 0||index > size )
return;
ListNode * p = dummyhead;
while(index--){
p = p->next;
}
ListNode *toAdd = new ListNode(val);
toAdd->next = p->next;
p->next = toAdd;
size++;
}
void deleteAtIndex(int index) {
if (index < 0 || index >= size)
return;
ListNode *pre = dummyhead;
while(index--){
pre = pre->next;
}
ListNode *p = pre->next;
pre->next = pre->next->next;
delete p;
//delete命令指示释放了p指针原本所指的那部分内存,
//被delete后的指针p的值(地址)并非就是nullptr,而是随机值。也就是被delete后,
//如果不再加上一句p=nullptr,tmp会成为乱指的野指针
//如果之后的程序不小心使用了p,会指向难以预想的内存空间
p = nullptr;
size--;
}
private:
int size;
ListNode *dummyhead;
};
三 206 反转链表
双指针思想的运用,把握好pre和cur指针的关系
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp; // 中间保存
ListNode* cur = head;
ListNode* pre = nullptr;
while(cur) {
temp = cur->next;
cur->next = pre;
// 更新pre 和 cur
pre = cur;
cur = temp;
}
return pre;
}
};
#四总结
-
相比于C语言中的NULL,nullptr是C++11版本新加入的,是为了解决NULL空指针在C++中具有二义性的问题,尤其是在函数重载中NULL为0可能会导致错误地选择函数。C++中的NULL如下:
#ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif
-
关于delete与野指针:delete命令指示释放了p指针原本所指的那部分内存,被delete后的指针p的值(地址)并非就是nullptr,而是随机值。也就是被delete后,如果不再加上一句p=nullptr,tmp会成为乱指的野指针,如果之后的程序不小心使用了p,会指向难以预想的内存空间。