zoukankan      html  css  js  c++  java
  • 链表

    1 基础巩固

    链表的最基础的知识需要掌握 头插法、尾插法 及 查找中间结点。有了这些最基本操作,才能应对更复杂的题目。
    

    1.1 尾插法

        ListNode *tail_insert(ListNode *head) {
            ListNode *dummy = new ListNode(-1);
            ListNode *tail = dummy;
            while (head != NULL) {
                ListNode *pnode = head;
                head = head->next;
                pnode->next = NULL;
                tail->next = pnode;
                tail = tail->next;
            }
            return dummy->next;
        }
    

    1.2 头插法

        ListNode *head_insert(ListNode *head) {
            ListNode *dummy = new ListNode(-1);
            ListNode *tail = dummy;
            while (head != NULL) {
                ListNode *pnode = head;
                head = head->next;
                pnode->next = tail->next;   //与尾插区别1
                tail->next = pnode;
                //tail = tail->next;   //与尾插区别2
            }
            return dummy->next;
        }
    

    1.3 发现中间结点

        ListNode *find_mid(ListNode *head) {
            if (head == NULL) {
                return NULL;
            }
            ListNode *slow = head, *fast = head->next;
            while (fast != NULL && fast->next != NULL) {
                slow = slow->next;
                fast = fast->next->next;
            }
            return slow;
    

    2 解题技巧

    2.1 DummyNode

    所谓DummyNode其实就是带头结点的指针,使用DummyNode的好处时,当我们不确定所求链表真正的头结点时,先以DummyNode作为头结点,然后依次增长链表。在上面尾插法建表与头插法建表过程中都用到了DummyNode。在解决很多链表问题时,当头结点不确定时,使用DummyNode都可以简化代码,如 remove duplicate node

    2.2 快慢指针

    两个指针思想在解决很多问题时都有体现,比如在解决数组问题时,经常用两个指针将数组分段,再讨论段与段之间的关系,如微软机试题目array patitiontow sum
    同样,在解决很多链表问题时,因为链表只能向后访问, 不能向前访问,所以我们通常会在之前设置一个指针记录一些之前的信息。比如需要寻找中点结点,需要两个速度不同的快慢指针。比如寻找倒数第K个元素,需要设定两个指针,一前一后。再比如,需要寻找中点的前一个结点,则需要在slow之前记录一个pre_slow指针,与slow指针同步。

    2.3 Segmentation fault

    这个问题在解决链表相关问题时经常会遇到,这是因为:在解决链表问题时,经常会用到pnode->val,pnode->next等等操作,但是使用前一定要现判断pnode首先自身不能指向NULL,这就是为什么程序刚开刚始一定要先考虑特殊情况:head == NULL ?,因为后面肯定会用来head->next。另外,链表问题程序很容易出现segmentation falt,一般也是判处每个使用成员操作符的指针本身是否是空指针。

    3 经典题目

    sort list by quick sort
    linked list cycle II:这道题目需要背一下答案
    merge k sorted list:总结一个priority_queue的常规用法,参考
    copy list with random pointer:练习hashmap解法
    convert list to BST:使用O(n)复杂度的方法来解决

  • 相关阅读:
    机器学习-数据表达与特征工程
    机器学习-朴素贝叶斯算法
    机器学习之广义线性模型
    机器学习-MNIST数据集使用二分类
    机器学习-数据预处理、降维、特征提取及聚类
    机器学习-神经网络
    机器学习-向量机SVM
    机器学习-决策树与随机森林
    深入计算机原理——第三章机器级的表示(三)
    深入计算机原理——第三章机器级的表示(二)
  • 原文地址:https://www.cnblogs.com/fariver/p/7197440.html
Copyright © 2011-2022 走看看