數據結構--單鏈表

實現了一個完整的單鏈表。node

時長看一看,深刻理解單鏈表的各個細節。ios

/*
設計一個算法求出單鏈表的倒數第m個結點,要求不得求出鏈表長度,不得對鏈表進行逆轉,若是找到這樣的結點就返回它的地址,若是沒有就返回NULL。
*/
#include <iostream>
using namespace std;

/**********************鏈表結構******************************/
template<typename DataType>class ListNode;

template<typename DataType>class LinkList
{
public:
    LinkList()
    {
        head = new ListNode<DataType>(777);
    }

    LinkList(ListNode<DataType>* firstNode)
    {
        head = firstNode;
    }

    //析構函數 
    ~LinkList()
    {
        delete head;
    }

    bool insertNode(int index, DataType newData);
    bool insertNode(DataType newData);
    bool removeNode(ListNode<DataType>* q);
    ListNode<DataType>* findNode(DataType value);
    void cleanLink();
    DataType getNodeData(const int index);
    int getLength();
    ListNode<DataType>* getNode(int i);


private:
    ListNode<DataType>* head;
};

/*****************定義鏈表結點***********************/
template<typename DataType> class ListNode
{
public:
    ListNode()
    {
        next = NULL;
    }

    ListNode(const DataType item, ListNode<DataType>*nodeNext = NULL)
    {
        data = item;
        next = nodeNext;
    }

    ~ListNode()
    {
        next = NULL;
    }

    DataType getData()
    {
        return data;
    }

    ListNode<DataType>* getNext()
    {
        return next;
    }

private:
    friend class LinkList<DataType>;
    ListNode<DataType>* next;
    DataType data;
};


template<typename DataType>
bool LinkList<DataType>::insertNode(int index, DataType newData)
{
    ListNode<DataType>* p = head;
    int j;
    for (j = 1; j <= i - 1; j++)
    {
        p = p->next;
        if (NULL == p)
        {
            break;//若是指針爲空,則不存在該結點或已到達表尾
        }
    }
    if (NULL == p && j < (i - 1))
    {
        std::cout << "插入位置無效" << std::endl;
        return false;
    }
    ListNode<DataType>* node = new ListNode<DataType>(newData);
    node->next = p->next;
    p->next = node;
    return true;
}

//鏈表表尾添加元素
template<typename DataType>bool LinkList<DataType>::insertNode(DataType newData)
{
    ListNode<DataType>* p = head;
    ListNode<DataType>* node = new ListNode<DataType>(newData);
    if (NULL == node)
    {
        return false;
    }
    while (NULL != p->next)
    {
        p = p->next;//遍歷單鏈表,找到表尾
    }

    p->next = node;
    return true;
}

template<typename DataType>
bool LinkList<DataType>::removeNode(ListNode<DataType>* q)
{
    if (NULL == q)
    {
        std::cout << "待刪除結點不存在!" << std::endl;
        return false;
    }
    ListNode<DataType>* tempPointer = head;
    while (tempPointer->next != q)
    {
        tempPointer = tempPointer->next;
    }

    tempPointer->next = q->next;
    delete q;
    return true;
}

template<typename DataType>
ListNode<DataType>* LinkList<DataType>::findNode(DataType value)
{
    ListNode<DataType>* currentPointer = head;
    //斷定遊標指針結點的值是否與value相等
    while (NULL != currentPointer && value != currentPointer->next)
    {
        currentPointer = currentPointer->next;
    }
    if (NULL == currentPointer)
    {
        std::cout << "沒有找到該結點!程序退出。" << std::endl;
        exit(1);
    }
    else
    {
        return currentPointer;//返回所找到的結點的指針
    }
}

template<typename DataType>
void LinkList<DataType>::cleanLink()
{
    ListNode<DataType>* current = head;
    while (NULL != head->next)
    {
        current = head->next;
        head->next = current->next;
        delete current;
    }
}

template<typename DataType>
DataType LinkList<DataType>::getNodeData(int index)
{
    int linkLength = getLength();
    if (index<1 || index > linkLength)
    {
        std::cout << "結點不存在!" << std::endl;
        return false;
    }
    else
    {
        ListNode<DataType>* pmove = head->next;
        for (int i = 1; i < index && NULL!=pmove; i++)
        {
            pmove = pmove->next;
        }
        return pmove->getData();
    }
}

template<typename DataType>
int LinkList<DataType>::getLength()
{
    int count = 0;
    ListNode<DataType>* p = head->next;
    while (NULL != p)
    {
        p = p->next;
        count++;
    }
    return count;
}

template<typename DataType>
ListNode<DataType>* LinkList<DataType>::getNode(int i)
{
    ListNode<DataType>* p = head->next;
    int j;
    if (i<1 || i>getLength() - 1)
    {
        return false;
    }
    for (j = 1; j < i; j++)
    {
        p = p->next;
        if (NULL == p)
        {
            break;
        }
    }
    if (NULL == p && j < i - 1)
    {
        return false;
    }
    return p;
}


//查找倒數第m個結點
ListNode<int>* searchNodeM(LinkList<int>* link, int m)
{
    ListNode<int>* p = link->getNode(1);
    if (NULL != p && m>0)
    {
        for (int i = 1; i < m; i++)
        {
            p = p->getNext();
            if (NULL == p)
            {
                std::cout << "該鏈表沒有倒數第m個結點" << std::endl;
                return NULL;
            }
        }
    }

    ListNode<int>* q = link->getNode(1);
    while (p->getNext() != NULL)
    {
        p = p->getNext();
        q = q->getNext();
    }

    return q;
}


int main()
{
    LinkList<int>* head = new LinkList<int>();
    int m;
    for (int i = 1; i <= 10; i++)
    {
        head->insertNode(i * 3);
    }
    
    cout << "請輸入m的值:";
    cin >> m;

    ListNode<int>* p = searchNodeM(head, m);
    for (int i = 1; i <= 10; i++)
    {
        cout << head->getNodeData(i) << " ,";
    }
    cout << endl;

    cout << "倒數第" << m << "個結點:" << p->getData() << endl;

    cout << "Hello World C++ Algorithm." << endl;
    system("pause");
    return 0;
}


/******
注意 LinkList 裏面都是 ListNode<DataType> 的形式。
*****/
相關文章
相關標籤/搜索