数据结构之链表篇(单链表的常见操作)

Posted tangcumalaxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之链表篇(单链表的常见操作)相关的知识,希望对你有一定的参考价值。


单链表的常见操作:

  1. 链表的定义
  2. 链表的初始化
  3. 链表的创建
  4. 测表长
  5. 链表插入
  6. 链表删除
  7. 打印链表
  8. 反转链表
// 链表的定义
struct linkList {
    int value;
    linkList *next;
};

// 链表的初始化
void initList(linkList *L)
{
    L = nullptr;
}

// 链表的创建(头插入法)
linkList* createList()
{
    linkList * head = new linkList;
    head->next = nullptr;
    if (head == nullptr)
    {
        std::cout << "分配内存失败!" << std::endl;
        return nullptr;
    }

    int input;

    std::cout << "输入链表值:" << std::endl;
    while (cin >> input && input != -1)
    {
        linkList *tmp = new linkList;
        tmp->value = input;
        tmp->next = head->next;
        head->next = tmp;
        tmp = nullptr;
    }

    return head;
}

// 测表长
int listLen(linkList *L)
{    
    int length = 0;
    while (L != nullptr)
    {
        length++;
        L = L->next;
    }
    //std::cout << "表长为:" << length - 1 << std::endl;
    return length-1;
}

// 链表插入
void insertList(linkList *L, int pos, int value)
{
    int index = 1;
    linkList *p = L;
    linkList *tmp = new linkList;
    tmp->value = value;
    if (pos <= 0 || pos > listLen(L) + 1)
    {
        printf("输入的位置不合法,无法插入!");
        return;
    }
    else if (pos == listLen(L) + 1)
    {
        while (p->next != NULL)
        {
            p = p->next;
        }
        tmp->next = nullptr;
        p->next = tmp;
        return;
    }
    else
    {
        while (index < pos)
        {
            index++;
            p = p->next;
        }
        tmp->next = p->next;
        p->next = tmp;
    }
}

// 链表删除
void deleteList(linkList *L, int pos)
{
    int index = 1;
    if (pos <= 0 || pos > listLen(L))
    {
        printf("输入的位置不合法,无法删除!
");
        return;
    }
    else
    {
        while (index < pos)
        {
            index++;
            L = L->next;
        }
        L->next = L->next->next;
    }
}

// 打印链表
void print(linkList *L)
{
    if (L->next == nullptr)
    {
        printf("链表中无元素!");
        return;
    }
    else
    {
        linkList *tmp = new linkList;
        tmp = L->next;
        while (tmp != NULL)
        {
            printf("%d->", tmp->value);
            tmp = tmp->next;
        }
        printf("NULL
");
    }
}

// 反转链表
linkList* reverseList(linkList *L)
{
    if (L == nullptr)
        return nullptr;
    linkList *rev = new linkList;
    rev->next = nullptr;
    while (L->next != nullptr)
    {
        L = L->next;
        linkList *tmp = new linkList;
        tmp->value = L->value;
        tmp->next = rev->next;
        rev->next = tmp;
        tmp = nullptr;
    }
    return rev;
}

int main(int argc,int* argv[])
{
    linkList *L = new linkList;
    initList(L);
    L = createList();
    print(L);
    insertList(L, 4, 10);
    print(L);
    deleteList(L, 5);
    print(L);
    linkList *rev = new linkList;
    rev->next = nullptr;
    rev = reverseList(L);
    print(rev);

    while (true)
    {
        getchar();
    }
    return 0;
}

 


以上是关于数据结构之链表篇(单链表的常见操作)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题笔记之链表篇876. 链表的中间结点

Leetcode刷题笔记之链表篇剑指 Offer 18. 删除链表的节点

Leetcode刷题笔记之链表篇剑指 Offer 18. 删除链表的节点

算法_链表篇

算法_链表篇

数据结构实验之链表五:单链表的拆分