D6 707.设计链表

707 设计链表(力扣:https://leetcode.cn/problems/design-linked-list/

条件: 见原题链接
Tips:

代码:

点击查看代码
struct ListNode{
    int val;
    ListNode* prev;
    ListNode* next;

    //使用初始化列表
    ListNode( int num ) : val(num), prev(nullptr), next(nullptr){}
};
//结构体结束的分号不要丢

class MyLinkedList {
private:
    ListNode* head;
    int size;

public:
    MyLinkedList() {
    head = nullptr;
    size = 0;
    }
    
    int get(int index) {
        if( index >= size){
            return -1;
        }

        ListNode* current = head;
        for(int i = 0; i < index; i++){
            current = current->next;
        }

        //current是指针,要用->而非.
        return current->val;

        }
    
    //极端情况是空链表,不要忘记
    void addAtHead(int val) {

        //创建值为val的新节点
        ListNode* newHead = new ListNode(val);

        if( head = nullptr){
            head = newHead;
        }else{
            //这里只用把新head和旧head的指针更新
            newHead->next = head;
            head->prev = newHead;
            head = newHead;
        }

        size++;
    }
    
    //空链表要考虑
    void addAtTail(int val) {
        ListNode* newTail = new ListNode(val);

        if(head = nullptr){
            head = newTail;
        }else{
            ListNode* current = head;

            //这里用while遍历更高效,因为尾部的特点是next一定为nullptr
            while( current->next != nullptr ){
                current = current->next;
            }

            current->next = newTail;
            newTail->prev= current;

            size++;
            }
    }
    
    
    void addAtIndex(int index, int val) {

        //void函数不能break
        if(index >= size){
            return;

        //头尾用成员函数
        }else if( index == 0 ){
            addAtHead(val);
        }else if( index == size){
            addAtTail(val);
        }

        else{
            ListNode* current = head;

            //不需要节点内再定义一个index
            //for这里按顺序遍历到的i自然对应节点的排位
            for(int i = 0; i < index - 1; i++){
                current = current->next;
            }

            ListNode* newNode = new ListNode(val);
            newNode->next = current;
            current->prev = newNode;

            if(current->next != nullptr){
            current->next->prev = newNode;
        }
        current->next = newNode;
        size++;
        }
    }
    
    void deleteAtIndex(int index) {
         if (index < 0 || index >= size) {
        return;  // 无效索引
    }
    
    if (index == 0) {  // 删除头节点
        ListNode* toDelete = head;
        head = head->next;
        if (head != nullptr) {
            head->prev = nullptr;
        }
        delete toDelete;
    } else {
        // 找到第index-1个节点
        ListNode* current = head;
        for (int i = 0; i < index - 1; i++) {
            current = current->next;
        }
        
        ListNode* toDelete = current->next;
        current->next = toDelete->next;
        
        if (toDelete->next != nullptr) {
            toDelete->next->prev = current;
        }
        
        delete toDelete;
    }
    size--;
    }
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */
posted @ 2026-01-21 23:24  SCONLY  阅读(0)  评论(0)    收藏  举报