数据结构-链表

数据结构-链表

链表

  • 只给定链表中的某一节点的指针,要求删除该节点
    1、删除操作一般会知道要删除节点的前驱节点,所以我们这里没有明显的给出前驱节点,那么需要伪造一个
    2、我们是可以利用常规的已知前驱节点的思想,删除该节点之后的任何一个节点
    3、链表节点的val值才是我们希望存储的数据,其地址是什么我们不关心
    4、删除当前节点,那可以用它后继节点的val值覆盖该节点的val值,这样我们把该节点当做前驱节点,从而删除该节点的后继节点,这样就相当于把该节点删除掉了,虽然没有释放其地址
    删除链表中的节点_leetcode273

  • 双指针
    1、在链表问题中往往需要遍历链表,对链表的某个节点进行增删改查,都会定义两个指针,一个是遍历指针,一个是操作指针
    2、一般是遍历指针到达某一个节点的时候刚好操作指针也能到达需要操作的节点
    删除链表的倒数第N个节点_leetcode19

  • 快慢指针
    1、一个指针快一个指针慢,快指针在一次循环中(while或for)可以递进两个或多个节点,比慢指针要递进的快,可以认为快指针比慢指针走的路程多一倍
    环形链表
    环形链表 II
    2、可以解决这样的问题,快指针运动到已知位置(如末尾)的时候,可知确定慢指针到达某一需要操作的指定节点
    如:找出链表中的中间节点
    通过二分法进行排序的情况,需要找到中间节点,并进行划分
    合并K个排序链表
    3、同样是对于有环的情况,可以通过快指针追上慢指针来判断链表是否有环
    环形链表 leetcode114

  • 哑结点
    1、含义:,哑节点(dummy node)是初始值val为无效值(如-1)的节点,创建在使用到链表的函数中,可以起到避免处理头节点为空的边界问题的作用,减少代码执行异常的可能性。
    2、但是我们平时用的哑结点只是用于实时改变该链表的头指针,例如在删除链表中某种属性的节点,并最后返回新的链表头指针,这是很可能该链表的头结点就符合该种属性需要删除,那么头结点就别改变了。

        ListNode* dummy=new ListNode(-1);
        dummy->next=head;
        ListNode* slow=dummy;
        ListNode* fast=head;

如果传入链表的头结点满足该属性需要被删除,则通过slow指针的next间接改变该链表的头指针

slow->next=fast->next

直至遇到新的头指针指向的头结点不满足该属性才会改变slow指针的指向

slow=fast

最后返回值是

return dummy->next

移除链表元素_leetcode203
删除排序链表中的重复元素_leetcode83
删除排序链表中的重复元素 II_leetcode82

在链表中,涉及到删除节点,需要使用pre来指向被删除节点的前一个节点。又因为头结点可能被删除,而头结点的pre为空。如果只用pre和cur两个指针,则需要讨论pre是否为空这种情况。为了将头结点一般化,在头结点前面,加上一个哑结点,从而可以减少代码中的讨论。使用范围:链表的删除

除此之外,链表的排序也会用到哑结点,因为当前头结点未必是最小的,链表头指针也可能会被改变。
排序链表
对链表进行插入排序
除此之外,两个有序链表的合并会用到,因为以两个链表的第一个节点最小的那一个作为新的头指针,所以头指针也会变
合并两个有序链表
合并K个排序链表
那么这样就可以总结出,凡是可能产生新的头指针,也就是当前头指针指向的节点可能不符合要求,可能要换掉,这时候需要用到哑结点,减少对头指针节点的判断。
这里强调的是可能,对于头指针一定会改变的情况下,也就没必要用哑结点

  • 递归
    1、链表问题也常常会用到递归解题
    2、对于需要对传入链表进行删改工作,并需要对链表进行遍历,之后要求返回新的头指针
    3、每一个递归函数里面需要进行的是对当前传入头指针指向的节点进行判断,是否进行删改操作
    其实上面举例的题目都可以用到递归
    4、递归同样可以用在排序。如使用二分法进行排序
    设计递归步骤
    其实很多的链表都可以用递归,其思想就是,当前函数返回的是当前头指针链表的某一个题目要求的结果,当前的递归函数执行的是当前节点下的链表操作。

首尾链接+断开

有时候需要把当前链表变成回环链表后再进行相关的操作,比如改变头指针,之后在进行断开,让新头指针的上一个节点为为尾节点
旋转链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值