面试中遇到一个反转链表的算法题,不算难,但是代码比较啰嗦。
基本思路是:建一临时表,将原表的表头移除,并放入临时表的表头,最后原链表为空,所有元素移入临时表。
===========================================================================
原表:1->2->3->4->5...
临时表:
------------------------------------------------------------------------------------------------
移动表头1,并插入临时表的表头:
原表:2->3->4->5...
临时表:1
------------------------------------------------------------------------------------------------
移动表头2,并插入临时表的表头:
原表:3->4->5...
临时表:2->1
------------------------------------------------------------------------------------------------
移动表头3,并插入临时表的表头:
原表:4->5...
临时表:3->2->1
===========================================================================
整理代码如下:
废话不说了, 上代码!
import java.util.Random;
public class LinkedList<T> {
private Entry<T> mHeader; // 链表头,暂时不设置表尾
public LinkedList() {
}
public void add(T value) { // 添加元素到表尾,如考虑性能,可设置表尾标志位
Entry<T> entry = new Entry<T>();
entry.value = value;
if (mHeader == null) {
mHeader = entry;
return;
}
Entry<T> tailFinder = mHeader;
while (tailFinder.next != null) {
tailFinder = tailFinder.next;
}
tailFinder.next = entry;
}
public void addFirst(T value) { // 添加元素到表头
Entry<T> entry = new Entry<T>();
entry.value = value;
addFirst(entry);
}
protected void addFirst(Entry<T> entry) { // 添加表项到表头
if (mHeader == null) {
mHeader = entry;
mHeader.next = null;
return;
}
entry.next = mHeader;
mHeader = entry;
}
protected Entry<T> removeFirst() { // 移除表头
Entry<T> first = mHeader;
mHeader = mHeader.next;
return first;
}
public Entry<T> getFirst() { // 获取表头
return mHeader;
}
public void revert() { // 反转链表
Entry<T> tmpHeader = null;
while (mHeader != null) {
Entry<T> removed = removeFirst();
removed.next = tmpHeader;
tmpHeader = removed;
}
mHeader = tmpHeader;
}
public String toString() { // 打印链表内容
if (mHeader == null) {
return null;
}
StringBuilder buff = new StringBuilder();
Entry<T> pointer = mHeader;
while (pointer != null) {
buff.append(pointer.value + ", ");
pointer = pointer.next;
}
if (buff.length() > 0) {
buff.delete(buff.length() - 2, buff.length());
}
return buff.toString();
}
public class Entry<V> { // 表项
V value;
Entry<V> next;
public String toString() {
return String.valueOf(value);
}
}
public static void main(String[] args) { // 测试
Random ran = new Random();
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < 10; i++) {
list.add(ran.nextInt(100));
}
System.out.println(list);
list.revert();
System.out.println(list);
}
}