实现了使用void返回值类型进行链表元素删除,并在LeetCode上进行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Solution { <br> public ListNode removeElements(ListNode head, int val) { ListNode dummyHead = new ListNode(- 1 , head); removeElement(dummyHead, val); <br> return dummyHead.next; } <br> private void removeElement(ListNode head, int val) { <br> // 判断递归终止条件 if (head == null || head.next == null ) { <br> return ; } <br> if (head.next.val == val) { head.next = head.next.next; removeElement(head, val); } else { removeElement(head.next, val); } } } |
我尝试使用返回值为void实现删除链表元素,我发现返回值的作用其实是将链表进行链接,如果使用void实现的话,则需要往前找一个结点,这样的话在删除结点时可以将后续链表与前一个结点相连。但是这样会出现一个问题就是如果删除的是第一个结点的话,第一个结点是没有前置结点的,故需要创建一个虚拟头结点来为用户传入的第一个结点提供一个前置结点。
正在回答
分析得非常正确,你学懂了:)
继续加油!:)
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode(-1, head);
removeElement(dummyHead, val);
return dummyHead.next;
}
private void removeElement(ListNode head, int val) {
// 判断递归终止条件
if (head == null)
return;
while (head.next != null && head.next.val == val) {
head.next = head.next.next;
}
removeElement(head.next, val);
}
1 | 调用了两次removeElement还可以优化一下,调用一次就可以。不过好像不太属于递归了,因为要处理对应情况。 |
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧