社区讨论

求个链表板子

学术版参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lu9qku43
此快照首次捕获于
2024/03/27 19:42
2 年前
此快照最后确认于
2024/03/27 21:15
2 年前
查看原帖
在手写带哨兵节点的双向循环链表翻转,写晕了,求个板子 。 下面是我的板子,还没有写好)
CPP
//
//

#ifndef MYDATASTRUCTUREANDALGORITHM_MYLINKEDLIST_HPP
#define MYDATASTRUCTUREANDALGORITHM_MYLINKEDLIST_HPP

#include "MyNode.h"
#include<cstdint>
#include <iostream>


namespace MyLinkedList {
    template<typename T>
    class DoubleLinkedList {
    public:
        using Pointer = MyNode::MyNode<T> *;
        Pointer sentinel;//哨兵节点
        int64_t size;
    public:
        DoubleLinkedList();

        ~DoubleLinkedList();

    public:
        void Insert(int64_t index, T value);

        void InsertFront(T value);

        void InsertLast(T value);

        void Remove(int64_t index);

        void RemoveFront();

        void RemoveLast();

        const T &GetHead() const;


        const T &GetTail() const;

        const T &GetValue(int64_t index) const;
        void ForwardIteration() const;

        void IntervalReverse(int64_t begin,int64_t end);

        void AllReverse();


    public:
        bool IsEmpty() const;

        int64_t Size() const;

    private:
        Pointer Get(int64_t index);

    public:
        const T &GetData(int64_t index) const;

    };
}
namespace MyLinkedList {
    template<typename T>
    DoubleLinkedList<T>::DoubleLinkedList() {
        sentinel = new MyNode::MyNode<T>({}, nullptr, nullptr);
        sentinel->next = sentinel;
        sentinel->prev = sentinel;
        size = 0;
    }

    template<typename T>
    DoubleLinkedList<T>::~DoubleLinkedList() {
        Pointer pNode = sentinel->next;
        while (pNode != sentinel) {
            Pointer temp = pNode->next;
            delete pNode;
            pNode = temp;
        }
        delete sentinel;
    }

    template<typename T>
    int64_t DoubleLinkedList<T>::Size() const {
        return size;
    }

    template<typename T>
    bool DoubleLinkedList<T>::IsEmpty() const { return size == 0; }

    template<typename T>
    void DoubleLinkedList<T>::InsertFront(T value) {
        Pointer newNode = new MyNode::MyNode<T>(value, sentinel, sentinel->next);
        sentinel->next->prev = newNode;
        sentinel->next = newNode;
        ++size;

    }

    template<typename T>
    void DoubleLinkedList<T>::InsertLast(T value) {
        Pointer newNode = new MyNode::MyNode<T>(value, sentinel->prev, sentinel);
        sentinel->prev->next = newNode;
        sentinel->prev = newNode;
        ++size;
    }

    template<typename T>
    DoubleLinkedList<T>::Pointer DoubleLinkedList<T>::Get(int64_t index) {
        if (index >= size) {
            return nullptr;
        }
        Pointer pNode;
        if (index <= size / 2) {
            pNode = sentinel->next;
            while (index--) {
                pNode = pNode->next;
            }
        } else {
            index = size - index - 1;
            pNode = sentinel->prev;
            while (index--) {
                pNode = pNode->prev;
            }
        }
        return pNode;
    }

//在index位置之前插入
    template<typename T>
    void DoubleLinkedList<T>::Insert(int64_t index, T value) {
        if (index == 0) {
            return InsertFront(value);
        }

        Pointer pNode = Get(index);
        if (pNode == nullptr) {
            std::cerr << "this is a nullptr" << '\n';
            return ;
        }

        Pointer newNode = new MyNode::MyNode<T>(value, pNode->prev, pNode);
        pNode->prev->next = newNode;
        pNode->prev = newNode;
        ++size;
    }

    template<typename T>
    void DoubleLinkedList<T>::RemoveFront() {
        if (!size) {
            std::cerr << "this is a nullptr" << '\n';
            return;
        }
        Pointer pNode = sentinel->next;
        sentinel->next = pNode->next;
        pNode->next->prev = sentinel;
        delete pNode;
        --size;
    }

    template<typename T>
    void DoubleLinkedList<T>::RemoveLast() {
        if (!size) {
            std::cerr << "this is a nullptr" << '\n';
            return;
        }
        Pointer pNode = sentinel->prev;
        pNode->prev->next = sentinel;
        sentinel->prev = pNode->prev;
        delete pNode;
        --size;
    }

    template<typename T>
    void DoubleLinkedList<T>::Remove(int64_t index) {
        if (index == 0) {
            RemoveFront();
            return;
        } else if (index == size - 1) {
            RemoveLast();
        } else if (index >= size) {
            return;
        }

        Pointer pNode = Get(index);
        pNode->prev->next = pNode->next;
        pNode->next->prev = pNode->prev;
        delete pNode;
        --size;
    }

    template<typename T>
    const T &DoubleLinkedList<T>::GetHead() const {
        return sentinel->next->data;
    }

    template<typename T>
    const T &DoubleLinkedList<T>::GetTail() const {
        return sentinel->prev->data;
    }

    template<typename T>
    const T &DoubleLinkedList<T>::GetValue(int64_t index) const {
        return Get(index)->data;
    }

    template<typename T>
    void DoubleLinkedList<T>::ForwardIteration() const {
        for (auto it = sentinel->next; it != sentinel; it = it->next) {
            std::cout << (it->data) << " -> " << ' ';
        }
    }


    template<typename T>
    void DoubleLinkedList<T>::IntervalReverse(int64_t begin, int64_t end) {
        Pointer pNode=Get(begin);
        Pointer eNode=Get(end);

        Pointer PrevpNode=pNode->prev;
        Pointer NexteNode=eNode->next;

        pNode->prev= nullptr;
        eNode->next= nullptr;


        PrevpNode->next=eNode;
        NexteNode->prev=pNode;
        

        pNode=PrevpNode->next;
        eNode=NexteNode;
        while(pNode!=eNode){

            std::cout<<pNode->data<<'\n';
//            std::cout<<pNode->prev->data<<'\n';
//            std::cout<<pNode->next->data<<'\n';

            Pointer temp=pNode->next;

           // std::swap(pNode->next,pNode->prev);
            pNode->next=pNode->prev;
            pNode->prev=pNode;
//            std::cout<<pNode->prev->data<<'\n';
//            std::cout<<pNode->next->data<<'\n';
//            std::cout<<'\n';
           // system("pause");
            pNode=temp;
        }


    }

    template<typename T>
    void DoubleLinkedList<T>::AllReverse() {
        IntervalReverse(0,Size()-1);
    }
}


#endif //MYDATASTRUCTUREANDALGORITHM_MYLINKEDLIST_HPP

回复

4 条回复,欢迎继续交流。

正在加载回复...