力扣-203-移除链表元素
方法一、不优化,特例判断
package LeetCode; /**返回链表的中间结点,如果有两个中间节点,则返回第二个**/ //双指针法:fast和slow,slow每次走一个单位,fast每次走两个单位 public class day10 { //情况1:这个代码有点复杂,存在删除头节点和尾节点两种情况 public ListNode removeElements1(ListNode head, int val) { if(head == null) return null; while(head.val == val){ //特例 [1,1,1,1] -> [],针对于开头一连串的val if(head.next == null) return null; else head = head.next; } ListNode prev = head; ListNode node = head.next; while(node != null) { if(node.val == val) { prev.next = node.next; }else{ prev = node; } node = node.next; } return head; } }
package LeetCode; /**返回链表的中间结点,如果有两个中间节点,则返回第二个**/ //双指针法:fast和slow,slow每次走一个单位,fast每次走两个单位 public class day10 { //情况2:优化,增加哨兵节点。使链表永不为空、永不无头、简化插入和删除 public ListNode removeElements2(ListNode head, int val) { ListNode sentinelNode = new ListNode(0); sentinelNode.next = head; ListNode prev = sentinelNode, curr = head; while(curr != null) { if(curr.val == val) prev.next = curr.next; else prev = curr; curr = curr.next; } return sentinelNode.next; } public static void main(String[] args) { //test() } }
方法二、利用哨兵节点,进行特例判断
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!