单链表的反转,首先要考虑,如果链表是空链表或者是一个链表,则不需要反转。其次要考虑反转时,需要三个指针,分别是前一个指针,当前指针,和下一个指针。最后要把头结点指针的指向赋值null,同时头结点指针重新指向前一个指针。分别用非递归和递归实现单链表反转。
循环实现单链表反转:
package cn.edu.nwu.structs.linklist;
/**
* @author jcm
*
*时间 2016年8月23日
*/
public class ReverseLinkList {
/**
* @author jcm
* 不使用递归,实现链表的反转
* @param head 头指针
* @return 返回新链表的头指针
*/
public static Node reverseLinkList(Node head){
if(head == null || head.next == null){
return head;//不需要反转
}
Node preNode = head;//第一个结点
Node currentNode = head.next;//第二个结点
Node pNextNode = null;//当前结点的下一个结点
while(currentNode != null){
pNextNode = currentNode.next;//备份当前结点指向的下一个结点
currentNode.next = preNode;//当前结点指向前一个结点,同时当前结点已经不再指向下一个结点
preNode = currentNode;//移动前一个结点,指向当前结点
currentNode = pNextNode;//当前结点指向下一个结点,同时当前结点已经不再指向前一个结点
}
head.next = null;//头指针不再指向以前链表的第一个结点
head = preNode;//头指针重新指向新链表的第一个结点
return head;
}
//递归实现单链表反转
/**
* @author jcm
* @param head 头指针
* @return 返回新链表的头指针
*/
public static Node reverseLinkListRecursion(Node head){
if(head == null || head.next == null){
return head;
}
Node pNextNode = head.next;//下一个结点
Node recursionNode = reverseLinkListRecursion(pNextNode);//递归
pNextNode.next = head;
head.next = null;
return recursionNode;
}
}
假设链表是:45 98 56 12 34 1 2 3
结果输出是:3 2 1 34 12 56 98 45