✅ 操作成功!

快慢指针

发布时间:2023-06-07 作者:admin 来源:文学

快慢指针

快慢指针

鲁米诺反应-社区医学

2023年2月22日发(作者:八卦五行属性对照表)

单链表常⽤算法

⽂章⽬录

单链表

单链表是⼀种包含⼀个指向后继节点的指针和数据域

/**

*节点类

*/

publicclassListNode{

intval;

ListNodenext;

ListNode(intx){val=x;}

}

单链表经典算法题

1.删除链表中等于给定值val的所有节点。

⽰例:

输⼊:1->2->6->3->4->5->6,val=6

输出:1->2->3->4->5

直接操作链表

/**

*删除链表中指定值的节点--->【双指针】

*@paramhead

*@paramval

*@return

*/

publicListNoderemoveElements(ListNodehead,intval){

if(head==null){

returnnull;

}

//要删除的是第⼀个节点

while(==val){

head=;

if(head==null){

returnnull;

}

}

//其他情况

//当前指针,指向当前节点

ListNodecurNode=;

//前驱指针,指向当前节点的前驱节点

ListNodepreNode=head;

while(curNode!=null){

if(==val){

//前节点的后继节点变成当前节点的后继节点

=;

curNode=;

}else{

preNode=;

curNode=;

}

}

returnhead;

}

递归解法

/**

*删除链表中指定值的节点--->【递归】

*@paramhead

*@paramval

*@return

*/

publicListNoderemoveElements2(ListNodehead,intval){

if(head!=null){

=removeElements(,val);

==val?:head;

}

returnhead;

}

2.返回链表的中间节点

给定⼀个带有头结点head的⾮空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第⼆个中间结点。

快慢指针

/**

*返回链表的中间节点---->【快慢指针】

*@paramhead

*@return

*/

publicListNodemiddleNode(ListNodehead){

if(head==null||==null){

returnhead;

}

ListNodeslow=head;

ListNodefast=head;

while(fast!=null&&!=null){

fast=;

slow=;

}

returnslow;

}

计算链表长度,然后返回从中间节点开始的序列

/**

*返回链表的中间节点---->【计算链表长度,然后返回从中间节点开始的序列】

*@paramhead

*@return

*/

publicListNodemiddleNode2(ListNodehead){

intlen=0;

ListNodeq=head;

while(q!=null){

len++;

q=;

}

inttemp=0;

ListNodenode=head;

while(node!=null){

temp++;

if(temp==len/2+1){

break;

}

node=;

}

returnnode;

}

3.删除指定节点

/**

*删除指定节点(单链表)--->【直接覆盖】

*时间复杂度:O(1)

*空间复杂度:O(1)

*@paramnode

*/

publicvoiddeleteNode(ListNodenode){

//后继节点覆盖node

=;

=;

}

4.删除链表中的重复元素

/**

*删除链表中的重复元素(单链表)【单指针】

*时间复杂度:O(N)

*空间复杂度:O(1)

*@paramhead

*@return

*/

publicListNodedeleteDuplicates(ListNodehead){

if(head==null){

returnnull;

}

//有序链表直接遍历即可

ListNodenode=head;

while(!=null){

if(==){

=;

}else{

node=;

}

}

returnhead;

}

5.反转链表

迭代

/**

*反转链表【迭代】

*@paramhead

*@return

*/

publicListNodereverseList(ListNodehead){

ListNodenewHead=null;

ListNodeh=head;

while(h!=null){

ListNodetmp=;

=newHead;

newHead=h;

h=tmp;

}

//pre:每次指向反转链表的头结点

returnnewHead;

}

递归

/**

*反转链表【递归】

*@paramhead

*@return

*/

publicListNodereverseList2(ListNodehead){

if(head==null||==null){

returnhead;

}

ListNodenewHead=reverseList();

//反转过程

=head;

=null;

returnnewHead;

}

6.删除倒数第n个节点

/**

*删除倒数第n个节点

*@paramhead

*@paramn

*@return

*/

publicListNoderemoveNthNode(ListNodehead,intn){

if(head==null||==null){

returnnull;

}

ListNodenode=newListNode(-1);

ListNodeslow=head;

ListNodefast=head;

for(inti=0;i

fast=;

}

while(fast!=null){

fast=;

slow=;

}

=;

;

}

👁️ 阅读量:0