题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
解题思路一
定义虚拟头节点cur(指向null)和链表头节点pre,循环时,首先缓存pre的next节点,再把pre节点指向cur节点,然后cur和pre同时向后移动一位(因为此时pre的next已经指向了cur,所以pre应该=之前缓存的值则为向下移动)
leetCode:
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
if (!head || !head.next) return head;
var cur = null, pre = head; // cur为虚拟头节点,循环中为当前节点, pre为链表节点
while (pre !== null) {
var t = pre.next; // 暂存下一个节点的位置
pre.next = cur; // 下一个节点指向当前阶段
cur = pre; // 当前节点向下移动到pre节点
pre = t; // pre节点移动到原始链表的下一个节点
}
return cur; // cur开头的则为反转后的链表
};
解题思路二
递归思想:递归函数调用到最后一个节点时,即为需要返回的头节点,记为ret;此后函数的每次返回, 让当前节点的一下个节点的next指向当前节点,同时让当前节点指向空节点,递归完成时返回ret,即为反转后的链表
leetCode:
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
if (!head || !head.next) return head;
var ret = reverseList(head.next); // 获取到反转后的头节点
head.next.next = head;
head.next = null;
return ret; // 每次递归返回反转后的链表,递归结束时即为反转完成的链表
};