链表处理:删除、找中点、判断环

删除链表的一个元素

若给出头结点和要删除的节点i,首先判断i是否为尾节点(i.next=null),若不是尾节点,则将后面一个节点j的值覆盖到节点i,然后将i节点指向j的下一个节点
if( i.next!=null) {
    node j=i.next;
    i.value=j.value;
    i.next=j.next;
    relax j;
}

需要考虑的特殊情况有:
1.只有一个节点,即头结点等于尾节点,那么只能删除该唯一的元素,即将头结点设为null。
2.若删除的节点为尾节点,则不能有复制的方法,只能从头到尾,依次遍历整个链表找到尾节点的前一个节点,然后将它置为尾。
3,若该节点即不是头结点也不是尾节点,则,可用上述代码思路完成,时间复杂度为O(1)。


输出链表的倒数第k个元素

思路一:
若是单向链表,则需要先计算得到链表的长度,才能找到倒数第k个元素,这样需要遍历两次链表,时间效率不高
思路二:
可以设置两个指针——1号和2号
1号指针先走k-1步。然后2号指针从头开始,1号指针从k-1开始,两个以相同的步调同时前进,当1号指针到到链表尾时,2号指针所指向的元素即为倒数第K个元素。
C++代码如下所示




这里还需要考虑几个边界问题,
1.若链表的长度小于k。
2.若输入的参数K是个负数或者0。
3.链表的头结点为null,可以归纳到长度小于k一类中进行处理。
因此,程序思考要全面,具有鲁棒性

找到链表的中间元素
        ——若链表元素个数为奇数,则输出中间爱元素,若为偶数,则输出中间两个任意一个
定义两个指针,一个一次走一步,一个一次走两步,当走两步的到达链表尾部,走一步的到达链表中间

判断链表是否有环

定义两个指针,一个一次走一步,一个一次走两步,若有环,则走 两步的指针会追上走一步的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值