题目
输入一个链表,反转链表后,输出链表的所有元素。
分析
首先这个题要看清楚,是反转链表再进行输出,而不是将链表反向输出。所以第一件要做的就是将链表反转。
假如首先我们只考虑两个节点的反转,只需要将head.next指向之前的节点就行了。但是假如有三个节点,加入第二个是当前的head的节点, 我们将head.next指向之前的节点,前两个节点的顺序交换了,但是第三个节点和第二个节点就断了。所以,还要一个节点记录head的后一个节点,防止链表断裂。
因此,head为当前节点,pre为head的前一个节点,next为head的后一个节点。具体的过程如下:
先用next保存head.next。防止链表断裂,无法继续下面的操作。
下面进行第二步,将当前节点的next指向上一个节点,也就是pre。
接下来,将head节点指向next,也就是第三个指针next的作用,pre指向head。
至此,可以看到我的第一个图有一点错误,head和pre之间是没有连接的,再次仅仅是为了开始的时候好理解。
代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null)
return null;
ListNode pre = null;
ListNode next = null;
while( head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}