力扣:移除链表元素
文章目录
思路
遍历链表,如果相等,需要删除的元素的左边节点指向删除元素的右边节点. 如果删除的是表头元素,为了统一,建立一个虚拟头结点
解题方法
定义一个虚拟头结点dummyHead,和遍历需要的指针cur,进入循环,遍历链表元素,如果相等就将删除的元素的左边节点指向删除元素的右边节点. 如果删除的是表头元素,为了统一,建立一个虚拟头结点.直到cur->next != null.因为cur == dummyHead. 实际上我们操作的也一直是cur->next;
复杂度
- 时间复杂度: O(n)
- 空间复杂度: O(1)
Code(java)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode();
dummyHead.next = head;
ListNode cur = dummyHead;
while(cur.next != null){
if(cur.next.val == val){
cur.next = cur.next.next;
}
else{
cur = cur.next;
}
}
return dummyHead.next;
}
}
Code(C++)
/**
* 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* dummyHead = new ListNode(0);
dummyHead->next = head; //这里要从虚节点的下一个操作
ListNode* cur = dummyHead;
while(cur->next != NULL){
if(cur->next->val == val){// 操作的永远是 cur->next
ListNode* tmp = cur->next; // 操作的永远是 cur->next
cur->next = cur->next->next;
delete tmp;
}else{
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};