单链表的相关定义与实现(8.24加入链表反转)

2017-07-13  本文已影响0人  曲谐_

顺序表的缺点及解决办法:

缺点:

解决思路:

链表方案:

项目代码实现思路:

1)获取单链表中第i个元素的数据

强调:这种做法需要让指针遍历,因此不是一个效率很高的做法。
具体算法思路:

2)在任意位置插入元素

强调:单链表的尾插非常方便,但是如果在任意位置插入,则需要遍历之前的所有元素直至找到当前位置。因此时间复杂度也较高,消耗资源大。
具体算法思路:

3)在任意位置删除元素

具体算法思路:

具体代码

1)Linklist.h
#include<string>
using std::string;
struct Node
{
    string name;
    Node * next;
};
class Linklist
{
private:
    Node * head;
    int length;
public:
    Linklist():head(NULL),length(0){};
    ~Linklist();
    Node * GetHead();
    Node * ReverseList(Node * head);
    void Insert(int pos,string st);
    void Delete(int pos);
    void GetLinkListElem(int i,string st);
    void Print();
};
2)Linklist.cpp
#include<iostream>
#include"Linklist.h"
using std::cout;
using std::endl;
Linklist::~Linklist()
{
    Node * temp = new Node;  
    for(int i=0;i<length;i++)  
    {  
        temp = head;  
        head = head->next;  
        delete temp; 
    }
}
Node * Linklist::GetHead()
{
    return this->head;
}
Node * Linklist::ReverseList(Node * head)
{
    Node * node = head;
    Node * prev = NULL;
    while(node != NULL)
    {
        Node * next1 = node->next;
        node->next = prev;
        prev = node;
        node = next1;
    }
    this->head = prev;
    return prev;
}
void Linklist::Insert(int pos,string st)
{
    int j = 1;
    Node * node = new Node;
    Node * p = head;
    if (pos == 1)
    {
        node->name = st;
        node->next = p;
        head = node;
        length++;
        return;
    }
    while(p && j < pos-1)//寻找p==pos-1的位置,在其后插入即为在pos处插入。
    {
        p=p->next;
        j++;
    }
    if(!p || j > pos)//考虑p超出链表范围(变成NULL),pos为0或小于0的情况
    {
        cout << "Cannot insert!" << endl;
        return;
    }
    node->name = st;
    node->next = p->next;
    p->next = node;
    length++;
}
void Linklist::Delete(int pos)
{
    int j = 1;
    Node * p = head;
    if (pos == 1)
    {
        head = head->next;
        length--;
        return;
    }
    while(p && j < pos-1)//寻找p==pos-1的位置,在p->next删除即为在pos删除。
    {
        p=p->next;
        j++;
    }
    if(!p || j > pos)//如果p超出范围或pos太小
    {
        cout << "Cannot delete!" << endl;
        return;
    }
    Node * temp = new Node;
    temp = p->next;
    p->next = temp->next;//把temp后面的结点和p->next链起来。
    delete temp;//释放temp,即p->next。
    length--;
}
void Linklist::Print()
{
    if(head == NULL)
    {
        cout << "Linklist has no elements." << endl;
        return;
    }
    Node * temp = head;
    while(temp != NULL)
    {
        cout << temp->name << "," << endl;
        temp = temp->next;
    }
    cout << endl;
}

3)具体测试main.cpp
#include"Linklist.h"
#include<iostream>
using std::cout;
using std::endl;
int main()
{
    Linklist L;
    L.Insert(1,"sword");
    L.Print();
    L.Insert(2,"edward");
    L.Print();
    L.Insert(3,"ed");
    L.Print();
    Node * head = L.GetHead();
    head = L.ReverseList(head);
    head = L.GetHead();
    L.Print();
    return 0;
}

4)输出结果

Paste_Image.png
上一篇 下一篇

猜你喜欢

热点阅读