反转链表
题目:
输入一个链表,将其反转,并返回头结点。
示例:
输入:{1,2,3}
输出:{3,2,1}
思路:
① 判断链表是否为空,若为空,返回null
② 定义三个指针,分别记为prev,cur,next。表示前驱、当前、后继节点。
③ 让cur指向链表中的第一个节点,prev、next置为空
④ 在遍历过程中,通过这三个引用改变链表的结构
⑤ 即next保存当前节点的下一个节点,以便找到下次循环的位置,将cur的next域置为prev,prev置为cur,cur置为next。从而达到了反转链表的目的。
图示:
如图所示,cur指向链表的第一个节点,prev指向cur的前一个节点,next指向cur的后一个节点。
我们让next指针指向的节点的next域指向cur,让cur指向的节点的next域指向prev,然后 将cur向前移,prev向前移,next = cur.next。如下图所示:
同理,继续移动cur、prev并改变节点的next域指向。如下图:
同理:
继续向前移动cur、prev、next
注意循环的过程,判断prev指向的节点是我们反转之后链表的头结点还是cur指向的节点时反转之后的头结点。
代码实现:
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null) return null;
ListNode prev = null;
ListNode cur = head;
ListNode next = null;
while(cur!=null){
next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
}