问题描述:
将一个单向链表反转,并输出反转后的链表头。
核心思路:
定义三个节点:current,previous(current的前邻节点)和following(current的后邻节点,为了和本来ListNode类中的next作区分,取名为following)。
用current遍历原链表时,先把following赋值为current本来的next(这一步相当于temp暂存。如果没有这一步,下一步更新完current.next之后就丢失了原本的next);因为反转后,原来存储后邻节点的next,此时应存储前邻节点,于是有了current.next = previous;最后,更新previous = current和current = following,为下一个循环做准备。
代码(Java):
ListNode类
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
反转方法
public ListNode Reverse(ListNode head){
if(head == null || head.next == null)
return head;
ListNode current = head;
ListNode previous = null;
ListNode following = null;
while(current != null){
following = current.next;
current.next = previous;
previous = current;
current = following;
}
return previous;
}