链表 - 反转链表

73 阅读1分钟

206. 反转链表

image.png

image.png

image.png

方法一:迭代

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    let prev = null;
    let curr = head;
    while (curr) {
        const next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
};

方法二:递归

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if (head == null || head.next == null) {
        return head;
    }
    const newHead = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return newHead;
};

方法三:虚拟头结点

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    // 创建虚头结点
    let dumpyHead = new ListNode(-1);
    dumpyHead.next = null;
    // 遍历所有结点
    let cur = head;
    while (cur != null) {
        let temp = cur.next;
        // 头插法
        cur.next = dumpyHead.next;
        dumpyHead.next = cur;
        cur = temp;
    }
    return dumpyHead.next;
};

方法四:使用栈来解决反转链表的问题

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
class Stack {
    constructor () {
        this.items = [];
    }

    // 向栈添加新元素
    push(element) {
        this.items.push(element);
    }

    // 从栈内弹出一个元素
    pop() {
        return this.items.pop();
    }

    // 判断栈是否为空
    isEmpty() {
        return this.items.length === 0;
    }
}

var reverseList = function(head) {
    // 如果链表为空,则返回空
    if (head == null) return null;
    // 如果链表中只有一个元素,则直接返回
    if (head.next = null) return head;
    // 创建栈 每一个结点都入栈
    let stack = new Stack();
    let cur = head;
    while (cur != null) {
        stack.push(cur);
        cur = cur.next;
    }
    // 创建一个虚拟头结点
    let pHead = new ListNode(0);
    cur = pHead;
    while (!stack.isEmpty()) {
        let node = stack.pop();
        cur.next = node;
        cur = cur.next;
    }
    // 最后一个元素的next要赋值为空
    cur.next = null;
    return pHead.next;
};