203.移除链表元素
链接: 203.移除链表元素
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyNode = new ListNode;
dummyNode->next = head;
ListNode* tmpNode = nullptr;
ListNode* currNode = dummyNode;
while(currNode->next != nullptr)
{
if(currNode->next->val == val)
{
tmpNode = currNode->next;
currNode->next = currNode->next->next;
delete tmpNode;
}
else
{
currNode = currNode->next;
}
}
currNode = dummyNode->next;
delete dummyNode;
return currNode;
}
};
思路与收获
- 本题可以采用带虚拟头节点和不带虚拟头节点两种思路求解。不带虚拟头节点的思路稍微复杂,我没有想出来,而如果采用带虚拟头节点的思路,则代码实现更清晰直观,与在链表中删除某个节点的思路相同。
707.设计链表
- 本题由于会占用大量时间没做。
206.反转链表
链接: 206.反转链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr || head->next == nullptr)
{
return head;
}
ListNode* pnext = head->next;
ListNode* pcurr = nullptr;
head->next = nullptr;
while(pnext != nullptr)
{
pcurr = pnext;
pnext = pnext->next;
pcurr->next = head;
head = pcurr;
}
return head;
}
};
思路与收获
- 本题可以采用递归与迭代两种思路。虽然之前做过但是第二次做还是不会,需要继续加强练习。另外虚拟头节点或者叫哨兵对于链表相关题目来说是一个很重要的思想。