1.删除值
输入: 链表head,需要删除的值val
方法: 分两种情况
- 删除的为头节点:让头节点指向下一个元素 删除头节点
- 非头节点:如果找到删除值,创建一个新指针指向当前删除元素\
输出: 删除后的链表head
leetcode: leetcode.cn/problems/re…
class Solution {
public:
// 删除元素值为val的结点 返回当前链表head
ListNode* removeElements(ListNode* head, int val) {
// 头节点 ---让头节点指向下一个元素 删除头节点
while (head != NULL && head->val == val) {
ListNode* p = head;
head = head->next;
delete p;
}
// 非头节点--- 如果找到删除值,创建一个新指针指向当前删除元素
// 指针后移,删除当前元素
ListNode* p = head;
while (p != NULL && p->next != NULL) {
if (p->next->val == val) {
// lnode=>next是要删除元素
ListNode* temp = p->next;
p->next = p->next->next;
delete temp;
} else {
p = p->next;
}
}
return head;
}
};
2.链表设计
leetcode: leetcode.cn/problems/de…
- 报了一个错 有链表空指针
Line 20: Char 19: runtime error: member access within null pointer of type 'ListNode' (solution.cpp) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior solution.cpp:20:19 - 写法和之前typedef不同
- linkNode改名linkedList就会报错
- 采用private 定义了size
class MyLinkedList {
public:
MyLinkedList() {
this->size = 0;
this->head = new ListNode(0);
}
int get(int index) {
// 无效范围
if (index < 0 || index > size) {
return -1;
}
// 初始指向头节点
ListNode* p = head;
// 遍历到index
for (int i = 0; i <= index; i++) {
p = p->next;
}
// 获取值
return p->val;
}
// 在链表的最前面插入一个节点
void addAtHead(int val) { addAtIndex(0, val); }
// 在链表的最后面插入一个节点
void addAtTail(int val) { addAtIndex(size, val); }
// 插入元素------在链表第index个节点前面插入一个节点
void addAtIndex(int index, int val) {
if (index < 0 || index >size) {
return ;
}
index = max(0, index);
size++;
// 初始指向头节点
ListNode *p = head;
// 遍历到index
for (int i = 0; i <index; i++) {
p = p->next;
}
//-------这些和上面获取值一样-------
// 插入元素
ListNode *q=new ListNode(val);
q->next=p->next;
p->next=q;
}
// 删除链表的第index个节点
void deleteAtIndex(int index) {
if (index < 0 || index >= size) {
return;
}
size--;
ListNode *pred = head;
for (int i = 0; i < index; i++) {
pred = pred->next;
}
ListNode *p = pred->next;
pred->next = pred->next->next;
delete p;
}
private:
int size;
ListNode* head;
};