203. 移除链表元素 707. 设计链表 206. 反转链表
203. 移除链表元素
实现思路
- 使用虚拟头节点,循环遍历删除。
- 不使用虚拟头节点的情况,需要特判头节点数据匹配的情况,则循环删除。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 头结点匹配的情况
while(head!=nullptr && head->val==val)
head = head->next;
// 当头节点为空的情况
if(head==nullptr)
return head;
// 其他情况
ListNode* p = head->next;
ListNode* q = head;
while(p!=nullptr)
{
if(p->val==val)
q->next = p->next;
else
q = p;
p = p->next;
}
return head;
}
};
707. 设计链表
完整代码
class MyLinkedList {
public:
struct LinkList {
int val;
LinkList* next;
LinkList(int x) :val(x), next(nullptr) {}
};
MyLinkedList() {
head = new LinkList(0);
head->next = nullptr;
_size = 0;
}
int get(int index) {
int i = 0;
// 校验位置合法性
if (index > _size - 1 || index < 0)
return -1;
LinkList* p = head->next;
// 判表空
if (p == nullptr)
return -1;
while (p != nullptr && i < index)
{
p = p->next;
i++;
}
if (p != nullptr)
return p->val;
// 找不到的情况
else
return -1;
}
void addAtHead(int val) {
// 创建新节点s
LinkList* s = new LinkList(val);
s->next = head->next;
head->next = s;
// 链表长度加一
_size++;
return;
}
void addAtTail(int val) {
// 创建新节点s
LinkList* s = new LinkList(val);
LinkList* p = head;
while (p->next != nullptr)
p = p->next;
p->next = s;
s->next = nullptr;
// 链表长度加一
_size++;
return;
}
void addAtIndex(int index, int val) {
// 校验位置合法性
if (index > _size)
return;
// 找到要插入的位置的前一个节点
LinkList* p = head;
int i = 0;
while (p != nullptr && i < index) {
p = p->next;
i++;
}
// 插入新节点
if (p != nullptr) {
LinkList* newNode = new LinkList(val);
newNode->next = p->next;
p->next = newNode;
_size++;
return;
}
// 在末尾插入新节点
else {
addAtTail(val);
return;
}
// 在头部插入新节点
if (index == 0) {
addAtHead(val);
p = head; // 将p指针设置为新的头结点
return;
}
}
void deleteAtIndex(int index) {
// 校验位置合法性
if (index > _size - 1 || index < 0)
return;
int i = 0;
LinkList* p = head->next;
LinkList* q = head;
while (p != nullptr && i < index)
{
q = p;
p = p->next;
i++;
}
if (p != nullptr)
{
q->next = p->next;
delete(p);
_size--;
}
return;
}
private:
LinkList* head;
int _size;
};
206. 反转链表
实现思路
本题使用就地逆置的方法,原理就是利用头插法。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* p = head; // 当前节点
ListNode* q; // 前驱节点
ListNode* dummy_head = new ListNode(); // 虚拟头节点
while (p != nullptr)
{
q = p;
p = p->next;
q->next = dummy_head->next;
dummy_head->next = q;
}
return dummy_head->next;
}
};

浙公网安备 33010602011771号