引子
昨天晚上,无意中刷到一篇关于链表的问题。突然又想起当年校招时被问到的一道有关链表面试题。突然心血来潮,准备记录一下,自己碰到的、或者搜罗到的一系列有关链表的面试题,在这里记录下来,并分享给大家。
文章目录
30+链表问题(一):如何判断链表是否成环?
30+链表问题(二):如何在一次循环中找到单链表的中间节点?
未完待续。。。
公共源码
在这里,我将贴出一些公共的源码,在后文中,我就不单独写了。
结点的实现:
/**
* @author Zereao
* @version 2019/9/6 11:45
*/
@Data
public class Node {
/**
* 指向前一个节点的引用
*/
private Node pre;
/**
* 指向下一个节点的引用
*/
private Node next;
/**
* 值
*/
private String value;
public Node(String value) {
this.value = value;
}
}
单链表实现:
/**
* 一个 单链表的实现
*
* @author Zereao
* @version 2019/9/6 11:47
*/
public class LinkedList {
/**
* 头指针
*/
private Node head;
/**
* 尾指针
*/
private Node tail;
public void add(Node node) {
if (this.tail == null) {
this.head = node;
} else {
this.tail.setNext(node);
}
this.tail = node;
}
/**
* 获取头结点
*
* @return 头结点
*/
public Node getHead() {
return this.head;
}
@Override
public String toString() {
if (this.head == null) {
return null;
}
Node pointer = this.head;
Node beforeTail = null;
StringBuilder sb = new StringBuilder().append(pointer.getValue());
while (pointer.getNext() != null) {
Node next = pointer.getNext();
if (next == tail) {
if (beforeTail == null) {
beforeTail = pointer;
sb.append(" --> ").append(next.getValue());
} else {
sb.append(" -----> ").append(next.getValue());
break;
}
} else {
sb.append(" --> ").append(next.getValue());
}
pointer = next;
}
return sb.toString();
}
}
源码附件
GitHub:https://github.com/Zereao/LinkListInterviewQuestion
参考文章
1、https://dzone.com/articles/20-linked-list-interview-questions-for-java-progra
2、https://javarevisited.blogspot.com/2017/07/top-10-linked-list-coding-questions-and.html