【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 }
复制代码

 

posted @   枫叶藏在眼眸  阅读(316)  评论(0编辑  收藏  举报
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示