力扣简203 移除链表元素
链表 递归 迭代
链表的定义具有递归的性质,因此链表题目常可以用递归的方法求解。这道题要求删除链表中所有节点值等于特定值的节点,可以用递归实现。
从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。
自己写的:
测试发现未考虑一开始就是空的list 还有未考虑删除后直接为空的list的情况 所以报了两次错

package leetcode01; import java.rmi.Remote; /*给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 *看到链表要先想需不需要试放删除的节点的空间*/ public class Solution203 { //自己写的代码:测试发现未考虑一开始就是空的list 还有未考虑删除后直接为空的list public static ListNode removeElements(ListNode head, int val) { while(head!=null && head.val==val) { head=head.next; } if(head==null) { return head; } ListNode head1=head.next; ListNode pre=head; while(head1!=null) { if(head1.val==val) { head1=head1.next; pre.next=head1; } else { pre=head1; head1=head1.next; } } return head; } public static void main(String[] args) { // TODO Auto-generated method stub ListNode head=new ListNode(1,new ListNode(1,new ListNode(1,new ListNode(1)))); head=removeElements(head, 1); System.out.println(head); } }
运用递归(自己写的):为啥人家答案就那么短
//看了递归的思路自己写的,本来不讲调用remove返回给head,是错误的,他会不断递归再返回一个值,最后return的head是第一层的head,也就是只删除了一层的结果。 public static ListNode removeElements(ListNode head, int val) { if(head==null) { return null; } if(head.val==val) { head=head.next; // removeElements(head, val); 下面为更改的结果 head=removeElements(head, val); } else if(head.val!=val) { head.next=removeElements(head.next, val); } return head; }
运用迭代:

自己写的思想居然就是迭代,只不过人家加了个头节点,简便了很多!
class Solution { public ListNode removeElements(ListNode head, int val) { ListNode dummyHead = new ListNode(0); dummyHead.next = head; ListNode temp = dummyHead; while (temp.next != null) { if (temp.next.val == val) { temp.next = temp.next.next; } else { temp = temp.next; } } return dummyHead.next; } } 作者:LeetCode-Solution 链接:https://leetcode.cn/problems/remove-linked-list-elements/solution/yi-chu-lian-biao-yuan-su-by-leetcode-sol-654m/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

浙公网安备 33010602011771号