算法类型描述以及举例06_反转链表( In-place Reversal of a LinkedList)
原帖子链接:https://zhuanlan.zhihu.com/p/104983442
1、简答描述
一种能够改变链表顺序并能重复使用遍历到的节点的算法。将每次遍历完原来链表的结果,的下一个指针位置指向一个结果链表。
2、优势
重复使用原链表中已有的节点,降低空间复杂度
3、使用场景
如果你被问到需要去翻转链表,要求不能使用额外空间的时候
4、例子
/**
* Definition for singly-linked list.
*/
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
/**
* leetcode_206_反转链表 链表反转
*
* 核心思路:将每次遍历完原来链表的结果,的下一个指针位置指向一个 结果链表!
*
*
* 具体做法:
* 1、一个pre,保存反转后的链表。(结果链表)
* 一个cur,用于遍历链表
*
* 2、每次cur遍历,将cur的next指向pre。 pre前移,指向cur即可
* (注意:需要保存cur.next 原cur的下一个节点的地址,用于遍历原链表)
* @param head
* @return
*/
public ListNode reverseList(ListNode head) {
ListNode pre = null;//定义pre指向空,保存翻转后的链表
ListNode cur = head;//利用cur去遍历原来链表。
while (cur != null) {
//将当前节点的next 保存到中间变量(很重要,否则下一步当前节点的next被pre覆盖,原来的next就丢失了。这样就无法遍历了)
ListNode temp = cur.next;
//将当前节点cur的下一个节点指向 pre。
cur.next = pre;
//将pre前移,指向当前节点cur
pre = cur;
//cur接着遍历! 让他等于之前保存的cur的next节点
cur = temp;
}
return pre;
}