Leetcode203.移除链表元素
1.思路
为了使删除头结点的操作和删除其他节点的操作一致,设置一个dummyhead,并且dummyhead->next=head;并且需要注意的是,只有当cur->next->val==val时,才做删除处理。
2.代码
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyhead= new ListNode(0);
dummyhead->next=head;
ListNode* cur=dummyhead;
while(cur->next != NULL){
if(cur->next->val == val){
ListNode* temp = cur->next;
cur->next=cur->next->next;
delete temp;
}
else{
cur=cur->next;
}
}
return dummyhead->next;
}
};
3.复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
4.Reference:代码随想录
Leetcode707.设计链表
1.思路
每个函数的实现逻辑比较简单,相比而言,对于class MylinkedList的private的准确把握还比较难(_size和dummynode);其次我在写的过程中犯了一个错误,在构造函数MyLinkedList()中我写了:LinkNode* dummynode=new LinkNode(0);导致了本来是要对私有数据成员dummynode进行初始化,但是这样写就变成了dummynode为构造函数内新声明的一个局部变量。导致私有数据成员dummynode一直未初始化,也就是指向一片未知的地址,就会报错。
2.代码
class MyLinkedList {
public:
// 定义链表结构体
struct LinkNode {
int val;
LinkNode* next;
LinkNode(int x) : val(x), next(nullptr) {}
};
MyLinkedList() {
dummynode = new LinkNode(0);
_size = 0;
}
int get(int index) {
if (index < 0 || index >= _size)
return -1;
else {
LinkNode* cur = dummynode;
for (int i = 0; i <= index; i++) {
cur = cur->next;
}
return cur->val;
}
}
void addAtHead(int val) {
LinkNode* cur = new LinkNode(val);
cur->next = dummynode->next;
dummynode->next = cur;
_size++;
}
void addAtTail(int val) {
LinkNode* new1 = new LinkNode(val);
LinkNode* cur = dummynode;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = new1;
new1->next = NULL;
_size++;
}
void addAtIndex(int index, int val) {
LinkNode* new2 = new LinkNode(val);
if (index > _size || index < 0)
return;
else {
LinkNode* cur = dummynode;
for (int i = 0; i < index; i++) {
cur = cur->next;
}
new2->next = cur->next;
cur->next = new2;
_size++;
}
}
void deleteAtIndex(int index) {
if (index < 0 || index >= _size)
return;
else {
LinkNode* cur = dummynode;
for (int i = 0; i < index; i++) {
cur->next = cur->next->next;
}
_size--;
}
}
private:
int _size;
LinkNode* dummynode;
};
3.Reference:代码随想录
Leetcode206.反转链表
1.思路
使用双指针pre和cur进行操作,需要注意的地方:
1.最后返回的是pre,因为此时cur指向了NULL
2.每次操作完cur->next=pre,不能写temp->next=cur(自己犯的一个错),否则链表会断掉
3.每次操作A节点,都是只实现A指向A的pre
2.代码
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre=NULL;
ListNode* cur=head;
ListNode* temp;
while(cur){
temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
};
3.复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)