【Java数据结构】带头节点单链表的反转,从尾到头输出,输出倒数第k个节点
Java单链表的四个面试题:
1、将单链表反转
2、从尾到头输出单链表
3、输出单链表的倒数第k个节点
4、将两个有序链表合并
1 import java.util.Stack; 2 3 /** 4 * @author ZhiYi Li 5 * @create 2020/8/25 20:45 6 */ 7 public class SingleLinkedTest { 8 //问题1:查找单链表中倒数第k个节点 9 //普通思路,先计算链表长度,然后用长度减去k得到顺序数的位置 10 //更装逼的思路,快慢指针思路,定义一个rear,定义一个front 11 //,先让front先走k个单位,之后front和rear同步增加,当front走到尾部时,rear就是在倒数k个的位置上 12 public static HeroNode getReciprocalK(HeroNode head,int k){ 13 if(head.next == null){ 14 return null; 15 } 16 HeroNode front = head; 17 HeroNode rear = head; 18 int i; 19 for (i = 0; i < k&&front!=null; i++) { 20 front = front.next; 21 } 22 if(i<k){ 23 return null; 24 } 25 while (front!=null){ 26 front = front.next; 27 rear = rear.next; 28 } 29 return rear; 30 } 31 //问题二:反转单链表(头插法) 32 public static void reverseNode(HeroNode head){ 33 if(head.next == null||head.next.next==null){ 34 return; 35 } 36 HeroNode temp = new HeroNode(0,"");//新头节点 37 HeroNode temp2 = head.next; 38 HeroNode temp3; 39 while (temp2!=null){ 40 temp3 = temp2.next; 41 temp2.next = temp.next; 42 temp.next = temp2; 43 temp2 = temp3; 44 } 45 head.next = temp.next; 46 } 47 //问题三:从尾到头打印单链表 48 public static void printRearToFront(HeroNode head){ 49 //方式一:递归输出,无法不让头节点输出,递归性能差,不建议使用 50 //其实也能让头节点不输出,将以下代码重写一个方法,将head.next传入 51 // HeroNode temp = head; 52 // if(temp!=null){ 53 // printRearToFront(temp.next); 54 // System.out.println(temp); 55 // } 56 //方式二:使用栈Stack,利用栈的特性来写 57 if(head.next == null){ 58 return; 59 } 60 Stack<HeroNode> stack = new Stack<>(); 61 HeroNode temp = head.next; 62 while (temp!=null){ 63 stack.push(temp); 64 temp=temp.next; 65 } 66 while (stack.size()>0){ 67 System.out.println(stack.pop()); 68 } 69 } 70 71 //问题四:将两个从小到大排序的单链表合并 72 public static HeroNode mergeNode(HeroNode head1,HeroNode head2){ 73 if(head1.next==null&&head2.next==null){ 74 return head1; 75 } 76 HeroNode res = new HeroNode(0,"");//新链表头 77 HeroNode temp = res; 78 HeroNode temp1 = head1.next; 79 HeroNode temp2 = head2.next; 80 while (temp1!=null&&temp2!=null){ 81 if(temp1.no<temp2.no){ 82 temp.next = temp1; 83 temp1=temp1.next; 84 }else { 85 temp.next = temp2; 86 temp2 = temp2.next; 87 } 88 temp = temp.next; 89 } 90 return res; 91 } 92 93 public static void main(String[] args) { 94 SingleLinkedList linkedList = new SingleLinkedList(); 95 linkedList.addNodeByNo2(new HeroNode(0,"张三")); 96 linkedList.addNodeByNo2(new HeroNode(1,"李四")); 97 linkedList.addNodeByNo2(new HeroNode(4,"王五")); 98 linkedList.addNodeByNo2(new HeroNode(2,"赵六")); 99 linkedList.addNodeByNo2(new HeroNode(3,"吴七")); 100 linkedList.show(); 101 System.out.println("倒数第k个节点:"); 102 System.out.println(getReciprocalK(linkedList.getHead(),5)); 103 linkedList.show(); 104 System.out.println("反转单链表:"); 105 reverseNode(linkedList.getHead()); 106 linkedList.show(); 107 System.out.println("从后往前打印单链表"); 108 printRearToFront(linkedList.getHead()); 109 System.out.println("将两个从小到大的单链表合并为有序链表:"); 110 SingleLinkedList linked1 = new SingleLinkedList(); 111 SingleLinkedList linked2 = new SingleLinkedList(); 112 linked1.addNodeByNo(new HeroNode(1,"aaa")); 113 linked1.addNodeByNo(new HeroNode(2,"aaa")); 114 linked1.addNodeByNo(new HeroNode(3,"aaa")); 115 linked1.addNodeByNo(new HeroNode(4,"aaa")); 116 linked2.addNodeByNo(new HeroNode(1,"aaa")); 117 linked2.addNodeByNo(new HeroNode(2,"aaa")); 118 linked2.addNodeByNo(new HeroNode(3,"aaa")); 119 linked2.addNodeByNo(new HeroNode(4,"aaa")); 120 HeroNode heroNode = mergeNode(linked1.getHead(),linked2.getHead()); 121 while (heroNode!=null){ 122 System.out.println(heroNode); 123 heroNode = heroNode.next; 124 } 125 } 126 127 }
分类:
Java数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构