算法与数据结构基础 – 链表(Linked List)增删改查

2019-08-0709:45:06数据结构与算法Comments2,927 views字数 704阅读模式

链表基础文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/15104.html

链表(Linked List)相比数组(Array),物理存储上非连续、不支持O(1)时间按索引存取;但链表也有其优点,灵活的内存管理、允许在链表任意位置上插入和删除节点。单向链表结构一般如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/15104.html

//Definition for singly-linked list.
    struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };

链表增删改查文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/15104.html

要完成链表节点的查找、插入、删除与修改,需要特别留意前后指针的修改、空指针的处理。总得来说链表增删改查分三步:1/定义结束条件(一般为到达链表尾) 2/遍历链表 3/遍历过程中完成增删改查。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/15104.html

一些情况下会用哑节点(dummy node)来更方便对链表增删改查,这有时可以减少代码量。比如 LeetCode题目 203. Remove Linked List Elements:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/15104.html

    // 203. Remove Linked List Elements
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummy=new ListNode(0);
        dummy->next=head;
        ListNode* cur=dummy;
        while(cur->next!=NULL){
            if(cur->next->val==val) cur->next=cur->next->next;
            else cur=cur->next;
        }
        return dummy->next;
    }

以上如果不使用dummy node,如果head是要被删除的节点,则需要特殊判断和处理,使用dummy node则化解了这个问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/15104.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/15104.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/15104.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定