删除链表的一个元素
若给出头结点和要删除的节点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一类中进行处理。
因此,程序思考要全面,具有鲁棒性
找到链表的中间元素
——若链表元素个数为奇数,则输出中间爱元素,若为偶数,则输出中间两个任意一个
定义两个指针,一个一次走一步,一个一次走两步,当走两步的到达链表尾部,走一步的到达链表中间
判断链表是否有环
定义两个指针,一个一次走一步,一个一次走两步,若有环,则走 两步的指针会追上走一步的指针