203. 移除链表元素
题目描述:给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
解答:对于非头节点和头节点分开进行考虑,头节点涉及到头指针的重新指向。删除时将上一节点指针指向此节点的下一个 即可。
代码实现:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode *p = head;
while(p != NULL){
//先进行头节点的删除
if (head->val == val){
p = p ->next;
head = p;
}
//考虑非头节点
else if (p->next != NULL && p->next->val == val){
p->next = p->next->next;
}
else{
p = p->next;
}
}
return head;
}
};
标准过程:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 删除头结点
while (head != NULL && head->val == val) { // 注意这里不是if
ListNode* tmp = head;
head = head->next;
delete tmp;
}
// 删除非头结点
ListNode* cur = head;
while (cur != NULL && cur->next!= NULL) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
return head;
}
};
707. 设计链表
题目描述:
解答:主要注意index从0开始,size是总数。对头结点进行操作需要单独考虑。
代码实现:
class MyLinkedList {
public:
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){}
};
MyLinkedList() {
_dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
_size = 0;
}
int get(int index) {
int i = 0;
if (index < 0 || index+1 > _size)
return -1;
LinkedNode *p =_dummyHead->next;
while(i < index){
p = p->next;
i++;
}
return p->val;
}
void addAtHead(int val) {
LinkedNode *newHead = new LinkedNode(val);
newHead->next = _dummyHead->next;
_dummyHead->next = newHead;
_size++;
}
void addAtTail(int val) {
LinkedNode *p =_dummyHead->next;
LinkedNode *newTail = new LinkedNode(val);
if (_size > 0){
while(p->next != NULL){
p = p->next;
}
p->next = newTail;
}
else{
_dummyHead->next = newTail;
}
newTail->next = NULL;
_size++;
}
void addAtIndex(int index, int val) {
if (index <= 0){
addAtHead(val);
return;
}
if (index == _size){
addAtTail(val);
return;
}
if(index > 0 && index < _size){
int i = 0;
LinkedNode *p = _dummyHead->next;
while(i+1 < index){
p = p->next;
i++;
}
LinkedNode *newNode = new LinkedNode(val);
newNode->next = p->next;
p->next = newNode;
_size++;
}
}
void deleteAtIndex(int index) {
if(index >=0 && index+1 <= _size){
LinkedNode *p = _dummyHead->next;
int i = 0;
while(i+1 < index){
p = p->next;
i++;
}
//删除头结点的情况
if(index == 1 || i != 0){
p->next = p->next->next;
_size--;
return;
}
else{
_dummyHead->next = p->next;
_size--;
return;
}
}
}
private:
int _size;
LinkedNode* _dummyHead;
};