题目链接
给你一个链表的头节点 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掉已经使用结束的链表。
代码:
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;
}



