203.移除链表元素
在原链表的基础上,先判断头结点,直到头结点符合条件,再判断整个链表
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 删除头结点
while (head && head->val == val) {
ListNode *temp = head;
head = head->next;
delete temp;
}
ListNode *cur = head;
while (cur && cur->next)
{
if (cur->next->val == val)
{
ListNode *temp = cur->next;
cur->next = cur->next->next;
delete temp;
} else {
cur = cur->next;
}
}
return head;
}
};
添加一个虚拟头结点,统一头节点和其他节点的操作,逻辑更清晰
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 删除头结点
ListNode *dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode *cur =dummyHead;
while (cur && cur->next)
{
if (cur->next->val == val)
{
ListNode *temp = cur->next;
cur->next = cur->next->next;
delete temp;
} else {
cur = cur->next;
}
}
return dummyHead->next;
}
};
文章链接:https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
707.设计链表
题目链接/文章讲解/视频讲解:https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html
class MyLinkedList {
public:
// 定义链表节点结构体
struct LinkNode {
int val;
LinkNode *next;
LinkNode(int val):val(val), next(nullptr){}
};
MyLinkedList() {
// 定义虚拟头结点
_dummyHead = new LinkNode(0);
_size = 0;
}
// 获取第index如果非法,返回-1 index从0开始,第0个节点就是头结点
int get(int index) {
if (index > (_size - 1) || index < 0) {
return -1;
}
LinkNode* cur = _dummyHead->next;
while (index--) {
cur = cur->next;
}
return cur->val;
}
// 在链表前插入一个节点
void addAtHead(int val) {
LinkNode *newNode = new LinkNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
_size++;
}
void addAtTail(int val) {
LinkNode *newNode = new LinkNode(val);
LinkNode *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;
LinkNode* newNode = new LinkNode(val);
LinkNode *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;
LinkNode *cur = _dummyHead;
while (index--) {
cur = cur->next;
}
LinkNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
temp = nullptr;
_size--;
}
private:
int _size;
LinkNode* _dummyHead;
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
题目链接/文章讲解/视频讲解:https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// 保存cur的下一个节点
ListNode* temp;
ListNode* cur = head;
ListNode* pre = nullptr;
while (cur)
{
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};