leetcode刷题 203, 707, 206

707 设计链表
题意:

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
// struct ListNode{
//     int val;
//     ListNode * next;
//     ListNode(): val(0), next(nullptr){}
//     ListNode(int x): val(x), next(nullptr){}
// }
class MyLinkedList {
private:
    ListNode * head;
    ListNode * tail;
public:
    MyLinkedList() {
        head = new ListNode(0);
        tail = head;
    }
    
    int get(int index) {
        ListNode * p = this->head;
        while(p != nullptr && index != -1){
            p = p->next;
            index--;
        }
        if(p != nullptr)
            return p->val;
        else
            return -1;
    }
    
    void addAtHead(int val) {
        ListNode * p = new ListNode;
        p->val = val;
        p->next = nullptr;
        p->next = this->head->next;
        this->head->next = p;
        if(this->tail == this->head)
            this->tail = p;
    }
    
    void addAtTail(int val) {
        ListNode * p = new ListNode;
        p->val = val;
        p->next = nullptr;
        this->tail->next = p;
        this->tail = p;
    }
    
    void addAtIndex(int index, int val) {
        int cnt = index;
        ListNode * q = nullptr;
        ListNode * p = this->head;
        while(p != nullptr && cnt != 0){
            p = p->next;
            cnt--;
        }
        if(p != nullptr){
            q = new ListNode;
            q->val = val;
            q->next = nullptr;
            q->next = p->next;
            p->next = q;
        }
        if(q != nullptr && q->next == nullptr)
            this->tail = q;
    }
    
    void deleteAtIndex(int index) {
        ListNode * p = this->head;
        while(p != nullptr && index != 0){
            p = p->next;
            index--;
        }
        if(p != nullptr){
            if(p->next == nullptr)
                return;
            ListNode * q = p->next;
            if(this->tail == q)
                this->tail = p;
            p->next = q->next;
            delete(q);
        }
        if(this->head->next == nullptr)
            this->tail = this->head;
    }
};

/**
 * 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);
 */

1.使用单链表实现,单链表具有头结点,头指针和尾指针。
2.addAtIndex(index,val)。注意在index处添加结点时,如果在最后一个结点添加,要改变尾指针的位置。
3.deleteAtIndex(index)。在index处删除结点的时候若删除的是尾指针指向的结点需要改变尾指针位置
4.addAtHead。在头部添加结点如果是第一个结点,则需改变尾指针位置。

posted @ 2024-12-28 09:39  arbiter9  阅读(8)  评论(0)    收藏  举报