题目:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
思路:
首先,我们给出一个链表。
现在我们要做的就是把箭头反转。那么问题就来了,3指向了2,2指向了1,那么1又指向谁呢?
总不能让人家做个野指针露宿街头吧?有个毛胚房都比流浪强。
这个时候就该空指针登场了。我们创建一个空指针。虽然1指向的地方家徒四壁,但好歹是个家啊!
但是问题又来了,当我好不容易把1连上了null的时候,2以及2之后的节点我就再也找不到了。链表不像数组,如果说数组是放在平地上任君欣赏的一个个相连的格子的话,那么链表就是一条在重力作用下下垂的链子。
1只要和2断开联系,那么就再也找不到彼此,就好像泷和三叶,互相忘了名字。
怎么办呢?把名字写下来保存在一个地方不就好了!(可别在这紧要关头表白啊喂!)
这时候就该轮到三位救命大哥登场了:前指针pre,后指针beh,以及中间指针cur,我把他们称为牵线搭桥月老三人组。
它们分别有什么用途呢?
pre和cur负责箭头的反转,
先令cur等于链表头,这个时候cur也相当于一个头,它下面也和原链表一样 ,然后cur直接连向pre,
之后,pre和cur要往下走,pre是可以走的,令pre=cur就可以,但是cur现在无路可走了,他已经忘记原本连着的2了,这个时候就要用到beh了。
beh提前为cur铺路,让pre和cur的局部反转工作完成后可以直接通过cur=beh想起“她”的名字。
这样我们就完成了1与2之间的反转,以此类推完成其他节点 也不成问题。
代码:
public class Solution206 {
public ListNode reverseList(ListNode head) {
ListNode pre=null;//前呼
ListNode cur=head;
ListNode beh=null;//后应
while(cur!=null){
beh=cur.next;
cur.next=pre;
pre=cur;
cur=beh;
}
return pre;
}
}
/*
import java.util.LinkedList;
public class ListNode extends LinkedList<Integer> {//ListNode类
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
*/