好久不见!学习博主即将开始认真营业(但愿),从做好一道小题开始重新拯救学习状态 😺
题目地址:移除链表元素
需要很多特判的暴利解法
是最直接能够想到的方法,核心是遍历思想,对头结点和尾结点进行了特判。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Solution { public ListNode removeElements(ListNode head, int val) { if(head == null) { return head; } while(head.val == val){ if(head.next != null){ head = head.next; } else { return null; } } if(head.next == null) { if(head.val == val) { return null; }else { return head; } } ListNode p = head; while(p != null && p.next != null && p.next.next != null) { if(p.next.val == val) { ListNode q = p.next; p.next = q.next; } else { p = p.next; } } if(p.next.val == val){ p.next = null; } return head; } }
|
优化之后的迭代法
- 对头结点的特判可以通过加“哨兵”节点解决
- 发现也不需要对尾结点进行特判了…我第一个方法是在写什么orz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public ListNode removeElements(ListNode head, int val) { if(head == null) { return head; } ListNode sentinel = new ListNode(-1,head); ListNode p = sentinel; while(p.next != null) { if(p.next.val == val) { p.next = p.next.next; }else { p = p.next; } } return sentinel.next; } }
|
递归
核心思想是持续处理子链表的头结点,如果头结点val
值相等则删除自身
- 利用
head.next
进行递归成功解决单链表没有上一节点元素的问题,总之就是,很神奇…
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public ListNode removeElements(ListNode head, int val) { if(head == null) { return head; } head.next = removeElements(head.next,val); if(head.val == val){ return head.next; }else { return head; } } }
|