力扣 203. 移除链表元素
1.题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
链表的删除,注意虚拟头结点的应用。
c++和Java都写了一下,好久不用c++基本语法忘了个八八九九。使用c++的时候,由于c++的内存回收需要手动回收,所以不要忘记delete
掉已经使用结束的链表。
代码:
/**
* 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) {}
* };
*/
ListNode* removeElements(ListNode* head, int val) {
ListNode* listNode = new ListNode(-1);
listNode->next = head;
ListNode* p = listNode;
while( p->next != nullptr ){
if(p->next->val == val){
ListNode* q = new ListNode(-1);
q = p->next;
if(q)
p->next = q->next;
delete q;
}
else
p = p->next;
}
head = listNode->next;
delete listNode;
return head;
}
java的写法可以说是完全一样了,只不过java的JVM提供了垃圾回收机制,JVM可以自动进行垃圾回收,不需要手动删除。
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; }
}
public ListNode removeElements(ListNode head, int val) {
ListNode listNode = new ListNode(-1);
listNode.next = head;
ListNode p = listNode;
while (p.next != null) {
if(p.next.val == val){
ListNode q = new ListNode(-1);
q = p.next;
if (q != null)
p.next = q.next;
}
else
p = p.next;
}
return listNode.next;
}