关于单链表的一些面试题--Java数据结构
2020-07-06 17:18
127 查看
获取单链表的有效结点的个数
这个相对比较容易,定义一个计数器 i,一个辅助遍历的变量temp,对单链表进行遍历,当temp不等于null时,i++
代码如下:
//获取单链表的有效结点个数 (如果是带头结点的链表,不统计头结点) public static int getlength(HeroNode head) { if(head.next==null) { return 0; } int i=0; HeroNode temp = head.next;//定义辅助变量,没有统计头结点 while(temp!=null) { i++; temp=temp.next; } return i; }
查找单链表倒数第k个结点
- 建立一个方法传入两个参数,分别是头结点以及k
- 首先遍历链表得到链表的长度n
- 接着再次遍历链表,当i=(n-k)时,即找到了目标结点,返回
代码如下:
//查找单链表中倒数第k个结点 public static HeroNode getnode(int k,HeroNode head) { if(head.next==null) { return null; } int n =getlength(head);//得到链表的长度 if(k<=0||k>n) { return null; } HeroNode temp = head.next; int i=0; while(temp!=null) { i++; temp=temp.next; if(i==(n-k)) { break; } } return temp; }
对单链表进行反转
- 定义一个新的链表头结点reverseList
- 定义一个用于遍历的cur,以及一个用于保存当前结点的下一结点的next
- 开始遍历原来的链表
- 先把当前结点的下一结点保存起来
- 接着把当前结点的next指向新的链表的最前端
- 再把当前结点cur加入到新的链表
- 另cur等于先前保存的结点
- 把原来链表的头结点指向新链表的第一个结点
代码如下:
//将单链表进行反转 public static void reverseList(HeroNode head) { //如果当前链表为空或只有一个结点,那么不用反转,直接返回 if(head.next==null||head.next.next==null) { return; } HeroNode cur = head.next; HeroNode next = null;//指向当前结点的下一个结点、 HeroNode reverseHead = new HeroNode(0,"",""); //遍历原来的链表,每遍历一个节点,将其取出放在新链表reverseHead的最前端 while(cur!=null) { next = cur.next;//先暂时保存当前结点的下一结点,留在后面使用 cur.next=reverseHead.next;//将cur的next指向新的链表的最前端 reverseHead.next=cur;//把cur加在新链表上 cur = next; } head.next=reverseHead.next; }
将链表逆序打印
逆序打印我们其实可以直接调用上面的方法,但有一个问题:上面的方法改变了数据结构,如果链表内容庞大时,则会花费较长时间。因此,这时就可以用到了栈。
- 把链表内容加入到栈中
- 对栈进行遍历,出栈
- 打印
代码如下:
public static void reversePrint(HeroNode head) { if(head.next==null) { return; } //创建一个栈,将各个结点压入栈中 Stack<HeroNode> stack = new Stack<HeroNode>(); HeroNode cur = head.next; //将链表的所有结点压入栈中 while(cur!=null) { stack.push(cur); cur =cur.next; } //将栈中的结点进行打印 while(stack.size()>0) { System.out.println(stack.pop()); } }
因为这些题是在上篇的代码基础上进行的,所以这里就不在说总的代码了。
大家有兴趣可以看上篇单链表的介绍https://blog.csdn.net/LanceHang/article/details/107125610
相关文章推荐
- 关于单链表的一些面试题-进阶篇(C语言实现)
- 关于java后端开发的一些面试题
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 关于单链表的一些面试题-基础篇(C语言实现)
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 关于java的一些经典面试题
- 关于java集合的一些面试题
- Java 关于线程的一些面试题
- 一些关于Java基础的面试题
- 关于Matlab,C/C++和Java之间的一些想法
- 转自木白 blog 关于java的数据结构(3)
- [原]关于java的编码规范的一些想法
- 转自木白 blog 关于java的数据结构
- 转载的关于java学习的一些东西
- 一个blog,关于java方面的面试题
- 关于java 的一些感受
- thinking in java 附录D 性能 附录E 关于垃圾收集的一些话
- 收集的一些JAVA面试题,与大家分享
- 转自木白 blog 关于java的数据结构(5)
- 关于Java泛型的一些思考