链表

1:链表

对比数组,插入删除等操作代价为O(1),随机存取的代价为O(n)。常见链表有单链表,双向链表,循环链表等。

常见链表操作、有:创建,插入,删除,遍历,逆转,排序等等

1.1单链表

  • 定义:
struct ListNode{
    int val;
    ListNode* next;
    ListNode(int n=0):val(n),next(NULL){}
};

1.2双向链表

  • 定义:
struct ListNode{
    int val;
    ListNode* next;
    ListNode* pre;
    ListNode(int n=0):val(n),next(NULL),pre(NULL){}
};

2:STL中的链表

链表可以轻松进行插入删除等操作而不影响迭代器,对比vector来说完全不同。vector由于插入和删除会引起内存重分配导致迭代器失效。

2.1 list

该链表为环形双向链表。只需要一个指针,指向置于尾端的一个空白节点,保持前闭后开的特点

2.1.1 操作

备注:下面所有注释代码为伪代码。只是为了读者大致明白意思
* begin
return (link_type)(node->next);
* end
return node;
* empty
return node==node->next;
* size
* front
* back

  • push_back
    void push_back(const T &x){
        insert(end(),x);
    }
  • push_front
    等于insert(begin(),x);

  • erase
    不做详细书写,参考链表删除操作(把当前元素删除,将前置节点和后置节点连起来,返回后置节点)

  • pop_front
    等于erase(begin())

  • pop_back
    void pop_end(){
        iterator tmp = end();
        erase(--tmp);
    }
  • clear
    清除所有节点并进行销毁

  • remove
    eg: remove(5). 遍历链表,移除所有元素值为5的节点

  • unique
    对连续且相同的元素,删除到只剩1个。eg: [1,2,2,1,4,4,4,5]进行unique操作后变成[1,2,1,4,5]

  • transfer
    内部操作,transfer(iterator pos,iterator first,iteratror last) 将[first,last)的元素移动到pos之前。

  • splice

    //将新链表x拼接到旧链表pos之前
    void splice(iterator pos,list &x); x不同于*this

    //将迭代器i所指元素插入到pos之前。x*this可以为同一链表或者非同一链表
    void splice(iterator pos,list &x,iterator i)

    //将[first,last)的元素移动到pos之前,注意pos不能在[first,last)之间
    void splice(iterator pos,iterator fisrt,iterator last)
  • merge
    //将链表x和当前链表进行合并,前提是两个链表进行了递增操作
    void merge(list &x);
  • rerverse
    链表反转

  • sort
    STL 自带sort只能用随机存取迭代器,list内置sort操作,该函数采用快排。

2.2 slist

slist不属于标准stl,不做特别介绍。slist为单向链表,迭代器只能++不能–,进行push和pop操作也只能进行push_front,pop_front操作,对插入特别提供insert_after操作。


3:经典算法题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值