这道题,是我毕业前在北京找实习真实碰到的一个面试题。
逆序谁不会是吧,啥?不能用数组,不能用字符串,集合。只能用node自己构建链表。
嗯,好像有点儿印象,大学学数据结构的时候都学过。
但是那会儿真是全忘了,面试官很有耐心,还教了我。唉。:)
分三步,第一步先实现链表,第二步顺序打印,第三步逆序打印,逆序打印这里有两种方案。1. 链表反转,顺序打印。2. 链表不动,逆序打印
上代码
package test;
public class Node {
public int value;
public Node next;
public Node(int i) {
value = i;
next = null;
}
/**
* 添加节点
* @param head 头节点
* @param add 新添加的节点
*/
public void add(Node head, Node add) {
if (head == null)
return;
while(head.next != null) {
head = head.next;
}
head.next = add;
}
/**
* 顺序打印
* @param head 头节点
*/
public static void print(Node head) {
if (head == null) {
System.out.println("链表是空的");
}
while(head != null) {
System.out.print(head.value + " ");
head = head.next;
}
}
/**
* 逆序打印
* @param head 头节点
*/
public static void reversePrint(Node head) {
if(head.next != null)
reversePrint(head.next);
System.out.print(head.value + " ");
}
/**
* 反转链表
* @param head 头节点
* @return
*/
public static Node reverse(Node head) {
if(head==null || head.next==null) return head;
Node p1 = head;
Node p2 = head.next;
p1.next = null;
while(p2.next != null) {
Node p3 = p2.next;
p2.next = p1;
p1 = p2;
p2 = p3;
}
p2.next = p1;
return p2;
}
}
package test;
public class NodeTest {
public static void main(String[] args) {
Node head = new Node(0);
for(int i=1;i<=10;i++) {
head.add(head, new Node(i));
}
Node.reversePrint(head);//逆序打印
System.out.println();
Node.print(Node.reverse(head));//反转链表并顺序打印
}
}
add方法要点:
这个while循环是这里的关键,它的意思举个例子。
原链表1->3->5
传入(1, new Node(2)) 会变成 1->3->5->2
****************************************
public void add(Node head, Node add) {
if (head == null)
return;
while(head.next != null) {
head = head.next;
}
head.next = add;
}
顺序就是用while输出value就行,逆序就是写个递归倒着输出value就行
重点说一下我做反转链表的思路
所有思路都在图片里面了。
PS:这应该是我最后一次主动在网上画图,太费劲儿了,以后还是手画。
图片是我自己画的1
图片是我自己画的2
网友评论