《算法导论》241页课后题10.2-7
参考:http://www.nowamagic.net/librarys/veda/detail/2241
方案一:三个辅助空间
不再赘述
方案二:头指针+两个辅助空间
思路:寻找一个辅助空间来存储当前节点,另一个节点存储当前节点的后继结点
初始化: current为头结点
循环过程:只要current.next不等于null
执行——pnext节点为:pnext=current.next
current.next指向pnext节点的后继结点:current.next=pnext.next
pnext.next指向头结点:pnext.next=L.head
头指针指向pnext节点:L.head=pnext
1、第一次循环过程
2、第二次循环过程
3、第三次循环过程
4、第三次次循环结果
public class SinglyLinkedListTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
SinglyLinkedList<Integer> singlyLinkedList = new SinglyLinkedList<>();
singlyLinkedList.printLink();
System.out.println(singlyLinkedList.getLength());
singlyLinkedList.add(1);
singlyLinkedList.add(2);
singlyLinkedList.add(3);
singlyLinkedList.add(4);
singlyLinkedList.add(5);
singlyLinkedList.add(6);
singlyLinkedList.printLink();
reverseSinglyLinkedList(singlyLinkedList).printLink();
singlyLinkedList.clear();
System.out.println(singlyLinkedList.getLength());
}
/*反转单链表的函数*/
public static SinglyLinkedList<Integer> reverseSinglyLinkedList(SinglyLinkedList<Integer> singlyLinkedList){
if (singlyLinkedList.getLength()>0) {
Node<Integer> current,pnext;
/*初始化: current为头结点*/
current=singlyLinkedList.getPreHead().next;
/*循环过程:只要current.next不为null */
while (current.next!=null) {
/*1、pnext节点为:pnext=current.next*/
pnext=current.next;
/*2、current指向pnext节点的后继结点*/
current.next=pnext.next;
/*3、pnext指向头结点:pnext.next=L.head*/
pnext.next=singlyLinkedList.getPreHead().next;
/*4、头指针指向pnext节点:L.head=pnext*/
singlyLinkedList.setPreHeadNext(pnext);
}
}
return singlyLinkedList;
}
}
控制台输出:
空链表
0
null→1→2→3→4→5→6→
null→6→5→4→3→2→1→
0