美文网首页
单链表算法题整理(思路详解)

单链表算法题整理(思路详解)

作者: 逐日追星看月亮 | 来源:发表于2018-06-23 17:53 被阅读0次
随便的配图

前一篇文章中记录了单链表的实现和基本操作,在此基础上,本次整理了单链表的相关常见算法题的思路和C语言实现,留作复习备忘,也希望看到此文的大家能有所收获;文中有不对或者不恰当的地方欢迎指正;如果你有更好的方法,欢迎留言交流。

本文完整代码:链表学习相关的笔记和代码(C 语言)

1.翻转链表

Status reserveLinkList(LinkList *L)
{
    if (*L == NULL) {
        printf("链表没有初始化");
        return ERROR;
    }
    if ((*L)->next == NULL) {
        printf("链表为空");
        return ERROR;
    }
    LinkList p, pPro, pNext;
    p = (*L)->next;
    pNext = p->next;
    pPro = NULL;
    while (pNext != NULL) {
        p->next = pPro;
        pPro = p;
        p = pNext;
        pNext = pNext->next;
    }
    p->next = pPro;
    pPro = p;
    (*L)->next = pPro;
    pPro = p = NULL;
    
    return OK;
}

2.判断链表中是否存在环
思路:使用快慢指针,使快指针每次走两步,慢指针每次走一步,如果两个指针在某个位置相遇,则有环

Status checkExistLoop(LinkList *L)
{
    if (*L == NULL) {
        printf("链表没有初始化!\n");
        return ERROR;
    }
    if ((*L)->next == NULL) {
        printf("链表为空");
        return ERROR;
    }
    LinkList fast, slow;
    slow = fast = (*L)->next;
    while (slow != NULL && fast != NULL) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            printf("该链表中有环\n");
            return OK;
        }
    }
    printf("该链表中没有环\n");
    return ERROR;
}

3.判断链表中是否存在环,有环的话找到环的入口
思路:使用快慢指针,使快指针每次走两步,慢指针每次走一步,如果两个指针在某个位置相遇,则有环,在第一次相遇的时候使快指针返回第一个节点,同时步长变为1,当再次相遇必然是在环入口

Status getLoopHead(LinkList *L, LinkList *loopHead)
{
    if (*L == NULL) {
        printf("链表没有初始化!\n");
        return ERROR;
    }
    if ((*L)->next == NULL) {
        printf("链表为空");
        return ERROR;
    }
    LinkList fast, slow;
    slow = fast = (*L)->next;
    while (slow != NULL && fast != NULL) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            break;
        }
    }
    if (slow != fast) {
        printf("该链表中没有环\n");
        return ERROR;
    }
    fast = (*L)->next;//快指针回到起点
    while (fast != slow) {
        fast = fast->next;
        slow = slow->next;
    }
    *loopHead = fast;
    return OK;
}

4.返回链表的中间节点
思路:使用快慢指针,快指针每次走两步,慢指针每次走一步,待快指针走到尾,慢指针正好走到中间节点

Status getMidNode(LinkList *L, ElemType *data)
{
    if (*L == NULL) {
        printf("链表没有初始化!\n");
        return ERROR;
    }
    if ((*L)->next == NULL) {
        printf("链表为空");
        return ERROR;
    }
    LinkList front, back;
    front = back = (*L)->next;
    while (front != NULL && front->next != NULL) {
        front = front->next->next;
        back = back->next;
    }
    *data = back->data;
    printf("链表中间结点的值获取成功:%d\n", *data);
    return OK;
}

5.返回链表中倒数第K个节点的值
思路:使用两个指针初始指向第一个节点,假设倒数第K个节点前有m个节点,则倒数第K个节点即是正数第m+1个节点,则指针要走m步才能指向第m+1个节点,由于链表长度未知,所以m无法确定,所以转换思路,将倒数第K转化为正数第K,则正数第K个节点后同样有m个节点,所以如此先使一个指针移动到指向正数第K个节点,然后两个指针一起前进,则当前边的指针走到链表末尾,即指向NULL时,后出发的指针正好指向要找的倒数第K个节点

Status getCountDownK(LinkList *L, int k, ElemType *data)
{
    if (*L == NULL) {
        printf("链表没有初始化!\n");
        return ERROR;
    }
    if ((*L)->next == NULL) {
        printf("链表为空");
        return ERROR;
    }
    LinkList front, back;
    int count = 1;
    front = back = (*L)->next;//指向第一个节点
    while (front->next != NULL) {
        count ++;
        if (count > k) {
            back = back->next;
        }
        front = front->next;
    }
    if (k > count) {
        printf("所求值不在链表范围内\n");
        return ERROR;
    }
    *data = back->data;
    printf("倒数第%d个结点的值获取成功:%d\n", k, *data);
    return OK;
}

6.倒序打印整个链表(递归)

Status printLinkListReserve(LinkList head)
{
    if (head != NULL) {
        if (head->next != NULL) {
            printLinkListReserve(head->next);
        }
    }
    printf("链表倒序输出:%d\n",head->data);
    return OK;
}

未完待续...

相关文章

  • 单链表算法题整理(思路详解)

    前一篇文章中记录了单链表的实现和基本操作,在此基础上,本次整理了单链表的相关常见算法题的思路和C语言实现,留作复习...

  • 11.LeetCode刷题For Swift·206. 反转链表

    1、原题 反转一个单链表。 示例: 2、思路 3、代码

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • 第二章 数据结构模板

    单链表 —— 模板题 AcWing 826. 单链表 双链表 —— 模板题 AcWing 827. 双链表 栈 —...

  • 嵌入式day16

    基本运算的相关算法 建立单链表 算法思路:依次读入表L=(a0................,an-1)中每一个...

  • 牛客网高频算法题系列-BM12-单链表的排序

    牛客网高频算法题系列-BM12-单链表的排序 题目描述 描述原题目见:BM12 单链表的排序[https://ww...

  • 2018-08-21

    算法题之判断单链表是否有环 判断单链表是否有环的算法核心思想是用两个指针,一个走的慢,一个走得快,如果两个相遇了则...

  • 链表专题 简单题

    leetcode链表题,简单题也是很重要的,复杂链表题也就是简单链表题的组合。简单题:237: 这道题思路有点不一...

  • 单链表

    单链表一些相关的算法集锦,单链表的算法可以提高逻辑能力。 反转链表 最基本的链表的题目,很简单的迭代操作,需要注意...

  • 常见面试算法题1:单链表逆置

    单链表逆置可以说是最为常见的一道算法面试题了;思路就是遍历单链表的同时,将当前节点的next指向头结点,并更新头结...

网友评论

      本文标题:单链表算法题整理(思路详解)

      本文链接:https://www.haomeiwen.com/subject/mckdyftx.html