1.算法描述
单链表逆转,就是把链表中 各结点的next域改为指向其前驱结点,原先第一个结点的next域为空,head改为指向原先的最后一个结点。逆转算法描述如下:
设p指向单链表中的某个结点,front指向p的前驱结点,则使p.next指向前驱的语句是
p.next = front
执行该语句之后将使p.next原指向后继的链断开,因此需要用另外的一个结点来保存p的后继结点。这三个结点引用同时沿单链表向后移动。
2.算法之java实现
本程序是在SinglyLinkedList类(单链表类)的基础上增加的单链表逆转功能,因此声明继承SinglyLinkedList类
package linearList;
public class ReverseLinkedList<E> extends SinglyLinkedList<E>{
public ReverseLinkedList(){
super();//调用父类同参数的构造方法
}
/*
* 逆转单链表
*/
public void reverse(){
Node<E> p = this.head,q = null,front = null;
while(p!=null){
q = p.next;//设置q是p结点的后继结点,即用q来保持p的后继结点
p.next = front;//逆转,即使p.next指向p结点的前驱结点
front = p;//front向后移一步
p = q;//p向后移一步
}
this.head = front;//head指向原链表的最后一个结点,完成逆转
}
public static void main(String[] args) {
ReverseLinkedList<Integer> list = new ReverseLinkedList<Integer>();
for(int i=1;i<6;i++){
list.add(0, new Integer(i));
}
System.out.println("单链表"+list.toString());
list.reverse();
System.out.println("逆转后"+list.toString());
}
}
程序执行结果如下:
单链表(5,4,3,2,1)
逆转后(1,2,3,4,5)