zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第2章:链表——题目1

    2014-03-18 02:16

    题目:给定一个未排序的单链表,去除其中的重复元素。

    解法1:不花额外空间,使用O(n^2)的比较方法来找出重复元素。

    代码:

     1 // 2.1 Remove duplicates from a linked list
     2 // inefficient without hashing space
     3 #include <cstdio>
     4 #include <unordered_set>
     5 using namespace std;
     6 
     7 struct ListNode {
     8     int val;
     9     struct ListNode *next;
    10     ListNode(int x): val(x), next(nullptr) {};
    11 };
    12 
    13 class Solution {
    14 public:
    15     void removeDuplicates(ListNode *head) {
    16         if (head == nullptr) {
    17             return;
    18         }
    19         
    20         struct ListNode *ptr, *del, *tmp;
    21         
    22         ptr = head;
    23         while (ptr != nullptr && ptr->next != nullptr) {
    24             del = ptr;
    25             while (del->next != nullptr) {
    26                 if (ptr->val == del->next->val) {
    27                     tmp = del->next;
    28                     del->next = tmp->next;
    29                     delete tmp;
    30                 } else {
    31                     del = del->next;
    32                 }
    33             }
    34             ptr = ptr->next;
    35         }
    36     }
    37 };
    38 
    39 int main()
    40 {
    41     int i;
    42     int n;
    43     int val;
    44     struct ListNode *head, *ptr;
    45     Solution sol;
    46     
    47     while (scanf("%d", &n) == 1 && n > 0) {
    48         // create a linked list
    49         ptr = head = nullptr;
    50         for (i = 0; i < n; ++i) {
    51             scanf("%d", &val);
    52             if (head == nullptr) {
    53                 head = ptr = new ListNode(val);
    54             } else {
    55                 ptr->next = new ListNode(val);
    56                 ptr = ptr->next;
    57             }
    58         }
    59         
    60         // remove duplicates from the list
    61         sol.removeDuplicates(head);
    62         
    63         // print the list
    64         printf("%d", head->val);
    65         ptr = head->next;
    66         while (ptr != nullptr) {
    67             printf("->%d", ptr->val);
    68             ptr = ptr->next;
    69         }
    70         printf("
    ");
    71         
    72         // delete the list
    73         while (head != nullptr) {
    74             ptr = head->next;
    75             delete head;
    76             head = ptr;
    77         }
    78     }
    79     
    80     return 0;
    81 }

    解法2:使用额外空间的话,可以用unordered_set作为hash工具,进行重复元素的查找,效率更高。

    代码:

     1 // 2.1 Remove duplicates from a linked list
     2 // efficient with hashing space
     3 #include <cstdio>
     4 #include <unordered_set>
     5 using namespace std;
     6 
     7 struct ListNode {
     8     int val;
     9     struct ListNode *next;
    10     ListNode(int x): val(x), next(nullptr) {};
    11 };
    12 
    13 class Solution {
    14 public:
    15     void removeDuplicates(ListNode *head) {
    16         if (head == nullptr) {
    17             return;
    18         }
    19         
    20         unordered_set<int> us;
    21         struct ListNode *ptr, *del;
    22         
    23         us.insert(head->val);
    24         ptr = head;
    25         while (ptr->next != nullptr) {
    26             if (us.find(ptr->next->val) != us.end()) {
    27                 // duplicate value
    28                 del = ptr->next;
    29                 ptr->next = del->next;
    30                 delete del;
    31             } else {
    32                 ptr = ptr->next;
    33                 us.insert(ptr->val);
    34             }
    35         }
    36         
    37         us.clear();
    38     }
    39 };
    40 
    41 int main()
    42 {
    43     int i;
    44     int n;
    45     int val;
    46     struct ListNode *head, *ptr;
    47     Solution sol;
    48     
    49     while (scanf("%d", &n) == 1 && n > 0) {
    50         // create a linked list
    51         ptr = head = nullptr;
    52         for (i = 0; i < n; ++i) {
    53             scanf("%d", &val);
    54             if (head == nullptr) {
    55                 head = ptr = new ListNode(val);
    56             } else {
    57                 ptr->next = new ListNode(val);
    58                 ptr = ptr->next;
    59             }
    60         }
    61         
    62         // remove duplicates from the list
    63         sol.removeDuplicates(head);
    64         
    65         // print the list
    66         printf("%d", head->val);
    67         ptr = head->next;
    68         while (ptr != nullptr) {
    69             printf("->%d", ptr->val);
    70             ptr = ptr->next;
    71         }
    72         printf("
    ");
    73         
    74         // delete the list
    75         while (head != nullptr) {
    76             ptr = head->next;
    77             delete head;
    78             head = ptr;
    79         }
    80     }
    81     
    82     return 0;
    83 }
  • 相关阅读:
    css3中强大的filter(滤镜)属性
    traceroute/tracert--获取网络路由路径
    CSS3 clip-path & clip-path 打破矩形设计的限制
    你未必知道的49个CSS知识点
    CentOS7使用firewalld打开关闭防火墙与端口
    部署K8S集群
    python 二分查找代码
    python进程间的通信
    一个线程1让线程2去调用一个函数怎么实现
    设计模式之工厂模式代码
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3606686.html
Copyright © 2011-2022 走看看