203.移除链表元素
题目链接/文章讲解/视频讲解::代码随想录
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
while (head != NULL && head->val == val) {
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;
}
};
其实这道题主要考的点在于指针以及链表的知识点,删除链表节点,主要分两个情况一个是头节点,一个是非头节点删除头节点需要再声明一个指针tmp指向头节点,然后头结点往后移,之后删除tmp就行,删除非头结点就需要用cur->next->val来判断是否是要删除的值,如果是的话就直接让tmp指针指向要删除的节点然后让cue->next指向cue->next->next,之后直接删除tmp就行
707.设计链表
题目链接/文章讲解/视频讲解:代码随想录
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) {
if (index > (_size - 1) || index < 0) {
return -1;
}
LinkedNode* cur = _dummyHead->next;
while(index--){
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
_size++;
}
void addAtTail(int val) {
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while(cur->next != nullptr){
cur = cur->next;
}
cur->next = newNode;
_size++;
}
void addAtIndex(int index, int val) {
if(index > _size) return;
if(index < 0) index = 0;
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while(index--) {
cur = cur->next;
}
newNode->next = cur->next;
cur->next = newNode;
_size++;
}
void deleteAtIndex(int index) {
if (index >= _size || index < 0) {
return;
}
LinkedNode* cur = _dummyHead;
while(index--) {
cur = cur ->next;
}
LinkedNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
tmp=nullptr;
_size--;
}
void printLinkedList() {
LinkedNode* cur = _dummyHead;
while (cur->next != nullptr) {
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
int _size;
LinkedNode* _dummyHead;
};
其实本质就是就是链表的增删改查首先先定义一个虚拟头结点(其实不用也可以就是会有点麻烦)
之后就是根据index--往后面查值,直到index为0 cur不再移动,那么这时候就可以传值
头插法其实只需要让刚刚生成的节点指向头结点的下一个节点,然后再让头结点指向刚刚生成的节点就行,记得让链表长度加一
尾插法只需要一直遍历到最后一个节点让最后一个节点指向刚刚生成的节点就行,记得让链表长度加一
首先要对index的值进行判断如果正常则进行下一步,然后根据传来的val的值生成新的节点,之后在根据index的值进行--操作定位到对应的·位置进行插入,插入方式一样
206.反转链表
题目链接/文章讲解/视频讲解:代码随想录
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp;
ListNode* cur = head;
ListNode* pre = NULL;
while(cur) {
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
这里建议用笔和纸对着代码模拟一下操作,其实把指针当做标记会好理解一些,这里需要三个指针
首先cur指针需要指向头指针然后让temp指针指向cur的下一个节点 再然后cue指向pre然后让pre赋到cur上之后让cur赋到temp上