题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表定义如下:
class Node<E> { E value; Node<E> nextNode; }
基本思路:
解法一:遍历。将指向下一个节点的指针指向上一个节点。(原链表的尾结点即是新链表的头节点)
解法二:递归。先让指向下一个节点的指针为空,然后递归调用,最后再将指向下一个节点的指针指向上一个节点。
解法一Java实现:
private static reverseHead(Node head) {
Node reverseHead=null;
Node cur=head;
Node pre=null;
while(cur!=null) {
Node next=cur.nextNode;
if(next==null)//next为空,即cur为源链表的尾结点
reverseHead=cur;
cur.nextNode=pre;//将指向下一个节点的指针指向上一个节点
pre=cur;
cur=next;
}
return reverseHead;
}
解法二Java实现:
/**
* 递归反转
* @param head
* @return
*/
private static Node reverseByRecur(Node current) {
if (current == null || current.nextNode == null) return current;
Node nextNode = current.nextNode;
current.nextNode = null;
Node reverseRest = reverseByRecur(nextNode);
nextNode.nextNode = current;
return reverseRest;
}