链表相关问题

2019-04-27  本文已影响0人  机器学习与自然语言处理

203.删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        /**
        * 为了避免下一个节点还是要删除的节点,这里使用while循环,来进行判断
        */
        
        while (head!=null && head.val == val) {
            ListNode delNode = head;
            head = head.next;
            delNode.next = null;
           //以上三行代码可以用一行代替 head = head.next;
        }
        //再删除掉头节点是需要删除的节点之后,如果后面的节点已经是空了,那就直接返回了
        if(head==null) {
            return null;
        }
        ListNode prev = head;
        while(prev.next != null) {
            if (prev.next.val == val) {
                //在删除节点后,prev节点并没有向后移动,这样避免下一个节点还是要删除的节点
                ListNode delNode = prev.next;
                prev.next = delNode.next;
                delNode.next =null;
//以上三行代码也可以用一行代替prev.next = prev.next.next 
            } else {
                prev = prev.next;
            }
        }
                    return head;

    }
}

也可以采用虚拟头节点的方式来优化这段代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
     
        //新建一个头节点,并且随机赋值
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;       
        ListNode prev = dummyHead;
        while(prev.next != null) {
            if (prev.next.val == val) {
                //在删除节点后,prev节点并没有向后移动,这样避免下一个节点还是要删除的节点
                ListNode delNode = prev.next;
                prev.next = delNode.next;
                delNode.next =null;
            } else {
                prev = prev.next;
            }
        }
            return dummyHead.next;

    }
}
上一篇 下一篇

猜你喜欢

热点阅读