zoukankan      html  css  js  c++  java
  • Remove Duplicates from Sorted List

    Source

    Given a sorted linked list,
    delete all duplicates such that each element appear only once.
    
    Example
    Given 1->1->2, return 1->2.
    Given 1->1->2->3->3, return 1->2->3.

    题解

    遍历之,遇到当前节点和下一节点的值相同时,删除下一节点,并将当前节点next值指向下一个节点的next, 当前节点首先保持不变,直到相邻节点的值不等时才移动到下一节点。

    C++

    /**
     * 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) {
            if (head == NULL) {
                return NULL;
            }
    
            ListNode *node = head;
            while (node->next != NULL) {
                if (node->val == node->next->val) {
                    ListNode *temp = node->next;
                    node->next = node->next->next;
                    delete temp;
                } else {
                    node = node->next;
                }
            }
    
            return head;
        }
    };

    Java

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public ListNode deleteDuplicates(ListNode head) {
            if (head == null) return null;
    
            ListNode node = head;
            while (node.next != null) {
                if (node.val == node.next.val) {
                    node.next = node.next.next;
                } else {
                    node = node.next;
                }
            }
    
            return head;
        }
    }

    源码分析

    1. 首先进行异常处理,判断head是否为NULL
    2. 遍历链表,node->val == node->next->val时,保存node->next,便于后面释放内存(非C/C++无需手动管理内存)
    3. 不相等时移动当前节点至下一节点,注意这个步骤必须包含在else中,否则逻辑较为复杂

    while 循环处也可使用node != null && node->next != null, 这样就不用单独判断head 是否为空了,但是这样会降低遍历的效率,因为需要判断两处。

    复杂度分析

    遍历链表一次,时间复杂度为 O(n), 使用了一个中间变量进行遍历,空间复杂度为 O(1).

  • 相关阅读:
    在二进制与文本之间转换plist文件
    iOS 音频分贝的计算
    iOS 圆形水波浪效果实现
    iOS画圆、画线
    iOS IM开发准备工作(四)CocoaAsyncSocket的使用
    iOS IM开发准备工作(三)乱说Socket
    iOS IM开发准备工作(二)protobuf-objc安装及使用
    iOS IM开发准备工作(一)XML解析
    iOS IM开发blog写作计划
    西游记倒着看。。我从贴吧看来的
  • 原文地址:https://www.cnblogs.com/lyc94620/p/15551381.html
Copyright © 2011-2022 走看看