链表算法题小结
来源:互联网 发布:js touchevent 编辑:程序博客网 时间:2024/06/01 08:11
一 打印两个有序链表的公共部分
给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。
package 打印链表公共部分;//有序链表public class Node { public int info; public Node link; public Node(int data){ this.info=data; } public void printNode(Node head1,Node head2){ while(head1!=null&&head2!=null){ //如果head1的值小于head2,则head1往下移动 if(head1.info<head2.info){ head1=head1.link; } //如果head2的值小于head1,则head2往下移动 else if(head1.info>head2.info){ head2=head2.link; } //若二者的值相等,则打印出来,并将head1和head2都往下移动 else{ System.out.println(head1.info); head1=head1.link; head2=head2.link; } } }}
二 删除单链表中倒数第K个节点
实现一个函数,可以删除单链表中倒数第K个节点
package 删除倒数第K个节点;public class Node {public int value; public Node next; public Node cur; public Node(int data){ this.value=data; } public void printNode(Node head,int k){ cur=head; //while循环结束时,若k大于0,则说明不存在倒数第k个数 while(cur!=null){ cur=cur.next; k--; } if(k<=0){ //k=0说明k等于链表的节点数 if(k==0){head=head.next;} else{ cur=head; //++k=0时,cur恰好代表要删除的节点的前一个节点 while(++k!=0){ cur=cur.next; } cur.next=cur.next.next; } } } }
三 删除链表的中间节点
实现一个函数,删除链表中间节点,例如
1 不删除任何节点
1→ 2删除节点1
1→ 2→ 3删除节点2
1→ 2→ 3→ 4删除节点2
1→2→3→4→ 5删除节点3
package 删除链表中间节点;public class Node { public int value; public Node next; public Node(int data){ this.value=data; } //head为首节点,num为节点数 public void removeMid(Node head,int num){ Node cur=head; //找到中心节点的位置 if(num==1)return; else if(num==2)head=null; else if(num%2==1)num=(num+1)/2; else num=num/2; while(num>2){ cur=cur.next; num--; } cur.next=cur.next.next; }}<strong></strong>
四 反转单向链表
实现反转单向链表的函数
package 反转单向链表;public class Node { public int value; public Node link; public Node(int data){ this.value=data; } public void reverseList(Node head){ Node p1=head; Node p2=head.link; Node p3=null; while(p2!=null){ p3=p2.link;//保留p2.link以便下次循环用 p2.link=p1;//将p1赋给p2.link,链表反转,p2.link将指向p1 /* * p2赋给p1 * p3赋给p2 * 循环后移一位 */ p1=p2; p2=p3; } //重新定义头节点 head=p1; }}
五 环形单链表的约瑟夫问题
约瑟夫环的相关问题,可参照我的另一篇博客约瑟夫环问题详述
输入:一个环形单链表头节点head和报数的值num
返回:最后生存下来的节点,且这个节点自己组成环形单链表,其他节点都删掉
package 环形单链表的约瑟夫问题;/* * 没删除一个节点,都要遍历m次,一共需要删除的节点数为n-1, * 故该解法的时间复杂度为O(n×m) */public class Node { public int value; public Node next; public Node(int data){ this.value=data; } public Node killOne(Node head,int num){ if(head==null||head.next==head||num<1){ return head; } Node last=head; //while语句将last引用指向head节点的前一个节点 while(last.next!=head){ last=last.next; } int count=0; while(last!=head){ if(++count==num){ last.next=head.next;//head.next此时相当于last.next.next,起到删除节点的作用 count=0; }else{ last=last.next;//last引用的指向向后移动 } head=last.next;//head引用始终指向last节点的下一个节点 } return head; }}
0 0
- 链表算法题小结
- 博弈题算法小结
- Hash表算法小结
- 表达式类算法题小结
- 表达式类算法题小结
- 算法小结
- 算法小结
- 算法小结
- 算法小结
- 面试算法题小结(一)
- 2017华为面试算法题小结
- FreeCodeCamp初级js算法题小结
- 各种基本算法实现小结(一)—— 链 表
- 各种基本算法实现小结(一)—— 链 表
- 各种基本算法实现小结(一)—— 链 表
- 各种基本算法实现小结(一)—— 链 表
- 链表相关算法小结(判断环、复制、逆序等)
- 排序算法小结
- c++primer第十三章拷贝控制小结-13
- 第八章 internet地址扩展技术
- DAY22:leetcode #52 N-Queens II
- 树莓派安装MySQL并进行远程登录
- C++插件架构浅谈与初步实现
- 链表算法题小结
- c#学习笔记之五 C与C#在几种主要数据结构在上区别 数组和枚举
- Lua - 7
- hibernate中的一对多(双向关系)
- 第九章 路由协议概述
- 人工智能会议小记
- Webview页面中按钮实现自动点击
- kafka high-level consumer 多线程访问异常
- ThinkPHP框架入门