方法一:头插法
从链表依次拿尾结点,头插到链表。此方法基本不用,因为开销大,尾结点头插时需要new,开辟新的空间,而原来的尾结点需要回收内存。
方法二:
(1)三个引用变量 p q s;
(2)改变方向,将q的next改为前驱节点;
(3)重新更新链表的头结点与尾结点。
public static <T extends Comparable<T>>void reverse(SingleLink<T> link){
if(link.isEmpty() || link.size() == 1){
return;
}
//定义p、q、s三个结点,分别初始化为链表的第一、第二、第三个结点
SingleLink.Entry<T> head = link.getHeadEntry();
SingleLink.Entry<T> p = head;
SingleLink.Entry<T> q = p.getNext();
SingleLink.Entry<T> s = q.getNext();
while(q != null){ //q != null
q.setNext(p);
p = q;
q = s;
if(s != null){
s = s.getNext();
}
}
//原来的尾巴是逆置链表的头部
link.setHeadEntry(p);
//原来的头部新的尾巴
link.setTailEntry(head);
//尾巴标记 next = null;
link.getTailEntry().setNext(null);
}