代码随想录算法训练营第三天 [ 203.移除链表元素 ,707.设计链表 , 206.反转链表 ]
一、203. 移除链表元素
链接: 代码随想录.
第一思路:= =
做题状态:看解析后做出来了
class Solution
{
public:
ListNode *removeElements(ListNode *head, int val)
{
直接删除头节点,就是把指向头节点的指针向后移动
while (head != nullptr && head->val == val)
{
ListNode *tmp = head;
head = head->next;
delete tmp;
}
ListNode *cur = head;
while (cur != nullptr && cur->next != nullptr)
{
if (cur->next->val == val)
{
ListNode *tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else
{
cur = cur->next;
}
}
return head;
//设置一个虚拟头节点
ListNode *dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode *cur = dummyHead;
while (cur->next != nullptr)
{
if (cur->next->val == val)
{
ListNode *tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else
{
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};
二、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 < 0 || index > _size - 1)
{
return -1;
}
LinkedNode *cur = _dummyHead->next;
while (index--)
{
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val)
{
LinkedNode *new_node = new LinkedNode(val);
new_node->next = _dummyHead->next;
_dummyHead->next = new_node;
_size++;
}
void addAtTail(int val)
{
LinkedNode *new_node = new LinkedNode(val);
LinkedNode *cur = _dummyHead;
while (cur->next != nullptr)
{
cur = cur->next;
}
cur->next = new_node;
_size++;
}
void addAtIndex(int index, int val)
{
if (index > _size)
{
return;
}
if (index == _size)
{
addAtTail(val);
return;
}
if (index < 0)
{
index = 0;
}
LinkedNode *new_node = new LinkedNode(val);
LinkedNode *cur = _dummyHead;
while (index--)
{
cur = cur->next;
}
new_node->next = cur->next;
cur->next = new_node;
_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;
};
三、 206.反转链表
链接: 代码随想录.
第一思路:= =
做题状态:看解析后做出来了
class Solution
{
public:
ListNode *reverseList(ListNode *head)
{
//双指针法
ListNode *cur = head;
ListNode *pre = nullptr;
while (cur)
{
ListNode *tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
class Solution
{
public:
ListNode *reverseList(ListNode *head)
{ // 递归法
return reverse(head, nullptr);
}
ListNode *reverse(ListNode *cur, ListNode *pre)
{
if (cur == nullptr)
{
return pre;
}
ListNode *tmp = cur->next;
cur->next = pre;
return reverse(tmp, cur);
}
};
四、 指针,地址的一些关键点
链接: CSDN链接.