本文总结面试题:
- 用Java实现一个栈
- 用Java实现一个队列
- 用Java实现一个链表
1. 用Java实现一个栈
import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.List;// 使用泛型,兼容各种数据类型
public class MyStack<T> {private List<T> stack = new ArrayList<>();// 入栈public void push(T item) {stack.add(item);}// 出栈public T pop() {if (stack.isEmpty()) {throw new EmptyStackException();}// 把最后一个元素删掉T item = stack.remove(stack.size() -1);return item;}// 查看栈顶元素public T peek() {if(stack.isEmpty()) {throw new EmptyStackException();}// 3-1=2 也就是栈顶的元素,指定了下标的位置return stack.get(stack.size() -1);}public boolean isEmpty() {return stack.isEmpty();}public int size() {return stack.size();}}
public class MyStackTest {public static void main(String[] args) {MyStack<Integer> stack = new MyStack<>();stack.push(1);stack.push(2);stack.push(3);System.out.println("栈顶元素" + stack.peek());System.out.println("出栈元素" + stack.pop());System.out.println("栈的大小" + stack.size());}
}
运行结果:
栈顶元素3
出栈元素3
栈的大小2
2. 用Java实现一个队列
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;public class MyQueue<T> {// 声明队列private BlockingQueue<T> queue = new LinkedBlockingQueue<>();// 入队列public void add(T t) {queue.add(t);}// 出队列public T get() throws InterruptedException {if(queue.isEmpty()) {return null;}return queue.take();}
}
public class MyQueueTest {public static void main(String[] args) throws InterruptedException {MyQueue<String> myQueue = new MyQueue<>();myQueue.add("1");myQueue.add("2");myQueue.add("3");System.out.println(myQueue.get());System.out.println(myQueue.get());System.out.println(myQueue.get());}
}
运行结果:
1
2
3
3. 用Java实现一个链表
public class ListNode {int val;ListNode next;public ListNode(int val) {this.val = val;}
}
public class MyLinkedList {private ListNode head;/*** 链表新增数据* @param val*/public void insert(int val) {ListNode newNode = new ListNode(val);// 链表为空,则保存到当前节点if(head == null) {head = newNode;} else {// 链表不为空,则向链表下一个节点寻找,直到为空为止ListNode current = head;while(current.next != null) {current = current.next;}// 直到下一个节点为空,则插入当前新增的节点current.next = newNode;}}/*** 链表删除数据* @param val*/public void delete(int val) {// 如果链表为空,则直接返回if(head == null) {return;}// 如果是头节点,把下一个节点的值赋值给头节点if(head.val == val) {head = head.next;return;}// 否则不是头节点,通过遍历直到找到存储对应值那个节点,然后把那个节点的后一个节点往前挪,当前节点就失去了引用ListNode current = head;while(current.next != null && current.next.val != val) {current = current.next;}if(current.next != null) {current.next = current.next.next;}}/*** 展示链表上的所有值*/public void display() {ListNode current = head;while(current != null) {System.out.println(current.val + "");current = current.next;}System.out.println();}
}
public class MyLinkedListTest {public static void main(String[] args) {MyLinkedList list = new MyLinkedList();list.insert(1);list.insert(2);list.insert(3);list.display();list.delete(2);list.display();}
}
运行结果:
1
2
31
3