You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode #707 设计链表实现输出错误排查求助

问题分析与修正

你的双向链表实现存在多个逻辑错误,导致链表结构混乱,最终get(4)返回错误结果。以下是具体问题和修复方案:

1. addAtHead方法:指针指向逻辑错误

原代码中修改指针的顺序错误,导致新节点的next指向自己:

// 错误代码
head.next.prev = newHead;
head.next = newHead;
newHead.next = head.next; // 此时head.next已经是newHead,所以newHead.next指向自己

修复:先设置新节点的next和prev,再修改原链表的指针:

public void addAtHead(int val) {
    DoublyListNode newNode = new DoublyListNode(val);
    newNode.next = head.next;
    newNode.prev = head;
    head.next.prev = newNode;
    head.next = newNode;
}

2. addAtTail方法:指针指向逻辑错误

类似addAtHead的问题,原代码顺序错误导致新节点的prev指向自己:

// 错误代码
tail.prev.next = newTail;
tail.prev = newTail;
newTail.prev = tail.prev; // 此时tail.prev已经是newTail,所以newTail.prev指向自己

修复:调整指针设置顺序:

public void addAtTail(int val) {
    DoublyListNode newNode = new DoublyListNode(val);
    newNode.prev = tail.prev;
    newNode.next = tail;
    tail.prev.next = newNode;
    tail.prev = newNode;
}

3. get方法:遍历起始点错误

原代码从哨兵head开始遍历,导致index=0返回哨兵节点的val(-1),而非第一个有效节点。同时未判断遍历后是否到达哨兵tail。
修复:从第一个有效节点head.next开始遍历,遍历过程中避免到达tail:

public int get(int index) {
    DoublyListNode curr = head.next;
    while (curr != tail && index > 0) {
        curr = curr.next;
        index--;
    }
    if (index == 0 && curr != tail) {
        return curr.val;
    }
    return -1;
}

4. addAtIndex方法:插入位置逻辑错误

原代码错误地将新节点插入到curr的前驱和后继之间,而非curr和curr.next之间,导致插入位置偏移。同时未处理index<0的情况。
修复:找到插入位置的前驱节点,将新节点插入到前驱和其后继之间,并处理index<0的边界情况:

public void addAtIndex(int index, int val) {
    if (index < 0) {
        addAtHead(val);
        return;
    }
    DoublyListNode curr = head;
    int count = 0;
    while (curr != tail && count < index) {
        curr = curr.next;
        count++;
    }
    if (count == index) {
        DoublyListNode newNode = new DoublyListNode(val);
        newNode.prev = curr;
        newNode.next = curr.next;
        curr.next.prev = newNode;
        curr.next = newNode;
    }
}

5. deleteAtIndex方法:遍历与删除逻辑错误

原代码从哨兵head开始遍历,可能错误地尝试删除哨兵节点,且未正确判断要删除的节点是否存在。
修复:从第一个有效节点开始遍历,找到目标节点后调整其前驱和后继的指针:

public void deleteAtIndex(int index) {
    DoublyListNode curr = head.next;
    int count = 0;
    while (curr != tail && count < index) {
        curr = curr.next;
        count++;
    }
    if (count == index && curr != tail) {
        curr.prev.next = curr.next;
        curr.next.prev = curr.prev;
    }
}

完整修复后的代码

class DoublyListNode {   
    int val;
    DoublyListNode next;
    DoublyListNode prev;

    public DoublyListNode(int val) {
        this.val = val;
        this.next = null;
        this.prev = null;
    } 
}

class MyLinkedList {    

    DoublyListNode head;
    DoublyListNode tail;
    
    public MyLinkedList() {
       head = new DoublyListNode(-1);
       tail = new DoublyListNode(-1);
       head.next = tail;
       tail.prev = head;
    }
    
    public int get(int index) {
        DoublyListNode curr = head.next;
        while (curr != tail && index > 0) {
            curr = curr.next;
            index--;
        }
        if (index == 0 && curr != tail) {
            return curr.val;
        }
        return -1;
    }
    
    public void addAtHead(int val) {
        DoublyListNode newNode = new DoublyListNode(val);
        newNode.next = head.next;
        newNode.prev = head;
        head.next.prev = newNode;
        head.next = newNode;
    }
    
    public void addAtTail(int val) {
        DoublyListNode newNode = new DoublyListNode(val);
        newNode.prev = tail.prev;
        newNode.next = tail;
        tail.prev.next = newNode;
        tail.prev = newNode;
    }
    
    public void addAtIndex(int index, int val) {
        if (index < 0) {
            addAtHead(val);
            return;
        }
        DoublyListNode curr = head;
        int count = 0;
        while (curr != tail && count < index) {
            curr = curr.next;
            count++;
        }
        if (count == index) {
            DoublyListNode newNode = new DoublyListNode(val);
            newNode.prev = curr;
            newNode.next = curr.next;
            curr.next.prev = newNode;
            curr.next = newNode;
        }
    }
    
    public void deleteAtIndex(int index) {
        DoublyListNode curr = head.next;
        int count = 0;
        while (curr != tail && count < index) {
            curr = curr.next;
            count++;
        }
        if (count == index && curr != tail) {
            curr.prev.next = curr.next;
            curr.next.prev = curr.prev;
        }
    }
}    

修复后,执行你的测试用例,get(4)会正确返回4,与预期输出一致。

内容的提问来源于stack exchange,提问作者Marcus Mousavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:20:54