力扣206:反转链表

908 阅读1分钟

题目

给你单链表的头节点 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; // 每次递归返回反转后的链表,递归结束时即为反转完成的链表
};