第一种做法:不设虚拟头节点:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//删除头节点(当头节点为val时)
//因为不设虚拟头节点,所以我们得对头节点进行判断,直至头节点不为val
while(head!= NULL &&head->val==val)
{
ListNode *tmp = head;//创建tmp指针用来指向将要释放的节点
head = head->next;
delete tmp;
}
//删除非头节点
ListNode *cur = head;
while(cur!=NULL&&cur->next!=NULL)
{
if(cur->next->val==val)
{
ListNode *tmp = cur->next;//创建tmp指针用来指向将要释放的节点
cur->next = cur->next->next;
delete tmp;
}
else
{
cur = cur->next;//若不为val,cur指针后移
}
}
return head;
}
};
第二种做法:设虚拟头节点:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val)
{
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
ListNode* cur = dummyHead;
while (cur->next != NULL)
{
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;
}
};
数组与链表的区别:
数组静态分配内存,链表动态分配内存。
数组在内存中是连续的,链表是不连续的。
数组利用下标定位,查找的时间复杂度是O(1),链表通过遍历定位元素,查找的时间复杂度是O(N)。
数组插入和删除需要移动其他元素,时间复杂度是O(N),链表的插入或删除不需要移动其他元素,时间复杂度是O(1)。