Lintcode LinkedList 113 Remove Duplicates from Sorted List II

Java Version
不能只写while (node.next.next!=null) 否则下述情况不成立,因为node为2,2的next为null就要终止
0->1->2->3->3->4->4->null
不能单单考虑下述情况
0->1->2->3->3->3->4->null

不同于 Lintcode 112 Remove Duplicates from Sorted List if(node->val == node->next->val) 本结点和下一个比较

if (node.next.val == node.next.next.val) 是比较node的下一个和下下个

/**

  • Definition for ListNode

  • public class ListNode {

  • int val;

  • ListNode next;

  • ListNode(int x) {

  • val = x;

  • next = null;

  • }

  • }*/

public class Solution {

/**
 * @param ListNode head is the head of the linked list
 * @return: ListNode head of the linked list
 */
public static ListNode deleteDuplicates(ListNode head) {
    // write your code here
    ListNode dummy = new ListNode(0);
    if (head == null) {
        return null;
    }
    dummy.next = head;
    ListNode node = dummy;
    while (node.next != null && node.next.next!=null) {
        if (node.next.val == node.next.next.val) {
            int val = node.next.val;
            while(node.next!=null && node.next.val == val)
            node.next = node.next.next;
        } else {
            node = node.next;
        }
    }
    return dummy.next;

}

}

C++ version 注意C++ NULL 而不是null

/**

  • Definition of ListNode

  • class ListNode {

  • public:

  • int val;

  • ListNode *next;

  • ListNode(int val) {

  • this->val = val;

  • this->next = NULL;

  • }

  • }*/

class Solution{public:

/**
 * @param head: The first node of linked list.
 * @return: head node
 */
ListNode * deleteDuplicates(ListNode *head) {
    // write your code here
    ListNode * dummy = new ListNode(0);
    dummy->next = head;
    head = dummy;
    while(head->next!=NULL && head->next->next!=NULL){
        if(head->next->val == head->next->next->val){
            int val = head->next->val;
            while(head->next!=NULL && head->next->val == val)
            head->next = head->next->next;
        }
        else
        head = head->next;
    }
    return dummy->next;
}

};

### Java LinkedList `remove` 方法详解 #### 1. 基本概念 Java 中的 `LinkedList` 是一种双向链表实现,继承自 `AbstractSequentialList` 并实现了 `Deque` 接口。它支持动态增删操作,在频繁执行插入和删除场景下性能优于 `ArrayList`[^3]。 #### 2. `remove` 方法概述 `LinkedList` 提供了多种方式用于移除元素,主要包括以下几种形式: - **按索引删除**: 调用 `remove(int index)` 可以根据指定的位置删除对应的元素,并返回被删除的元素值。如果索引超出范围会抛出 `IndexOutOfBoundsException` 异常[^2]。 - **按对象删除**: 调用 `remove(Object o)` 将尝试从列表中找到并删除第一次出现的目标对象(基于 `equals()` 判断)。如果没有匹配的对象则不作任何修改,并返回 `false`;否则返回 `true`[^1]。 - **特定方法删除首尾节点**: - `removeFirst()`: 删除头结点。 - `removeLast()`: 删除尾部节点。 - 这些方法适用于队列或栈的操作模式[^4]。 #### 3. 示例代码展示 以下是几个典型的例子演示如何使用这些功能: ```java import java.util.LinkedList; public class Main { public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); // 添加一些初始数据 list.add("A"); list.add("B"); list.add("C"); // 按照索引位置删除第二个元素 ("B") String removedElementByIndex = list.remove(1); System.out.println("Removed by Index: " + removedElementByIndex); // 移除首次出现的具体对象 (假设存在"A") boolean isRemoved = list.remove("A"); if(isRemoved){ System.out.println("'A' was successfully removed."); } // 输出当前状态 System.out.println("Current List after removals:" + list); // 测试其他特殊用途的方法 System.out.println("Remove First Element: "+list.removeFirst()); System.out.println("Final State After All Removal:"+list); } } ``` 上述程序展示了不同类型的删除行为及其结果反馈机制。 #### 4. 常见问题分析 - 如果试图访问不存在或者非法的索引会发生什么?当调用了像 `remove(index)` 的时候传入了一个越界的数值就会触发 `IndexOutOfBoundsException` 错误提示。 - 当目标对象不在集合里又该如何处理呢? 对于这种情况,采用的是安全的方式即不会引发异常而是简单地给出否定的结果(false)[^1]. #### 性能考量 由于内部结构特点决定了对于中间部分的大规模调整可能会带来额外开销因此建议尽量减少不必要的随机存取动作以便提高整体运行效率.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值