判断单链表是否有环、环长多少、入点为何、链表总长?C++实现

Q1.单链表是否有环?

Q2.环长多少?

Q3.入点为何?

Q4.链表总长?

 

A1.设置快慢指针,一个走两步、一个走三步,同时前进,如果二者相遇则有环,如果某一个指针遇到NULL则无环

A2.在快慢指针相遇后,二者再继续遍历链表,直至二者指针重合,所经过的长度为环长

A3.从二者的重合点和head指针处开始遍历,直到二者重合便为环的入点

A4.将A2,A3统计的数据相加即可

 

代码如下:

#include <cstdlib>
#include <iostream>

using namespace std;

typedef struct LinkNode {
    int value;
    struct LinkNode *next;
} link;

bool panhuan (link* head) {
    link *fastPtr = head;
    link *slowPtr = head;

    bool flag = true;
    while (fastPtr != slowPtr || flag) {
        flag = false;
        if (fastPtr == NULL || slowPtr == NULL) return false;
        fastPtr = fastPtr->next->next;
        slowPtr = slowPtr->next;
    }

    return true;
}

int huanChang (link *head) {
    link *fastPtr = head;
    link *slowPtr = head;

    bool flag = true;
    while (fastPtr != slowPtr || flag) {
        flag = false;
        if (fastPtr == NULL || slowPtr == NULL) return false;
        fastPtr = fastPtr->next->next;
        slowPtr = slowPtr->next;
    }

    int length = 1;
    fastPtr = fastPtr->next->next;
    slowPtr = slowPtr->next;
    while (fastPtr != slowPtr) {
        fastPtr = fastPtr->next->next;
        slowPtr = slowPtr->next;
        length++;
    }
    return length;
}

int InNode (link* head) {
    link *fastPtr = head;
    link *slowPtr = head;

    bool flag = true;
    while (fastPtr != slowPtr || flag) {
        flag = false;
        if (fastPtr == NULL || slowPtr == NULL) return false;
        fastPtr = fastPtr->next->next;
        slowPtr = slowPtr->next;
    }
    while (head != slowPtr) {
        head = head->next;
        slowPtr = slowPtr->next;
    }
    return head->value;
}

void print (link *head) {
    head = head->next;
    bool flag = false;
    while (1) {
        if (flag && head->value == 2) return;
        else {
            cout << head->value << " ";
            if (head->value == 2) flag = true;

            head = head->next;
        }
    }
}

int main ()
{
    // create link
    link *head = (link*) malloc (sizeof (link));
    head->next = (link*) malloc (sizeof (link));
    head->next->next = (link*) malloc (sizeof (link));
    head->next->next->next = (link*) malloc (sizeof (link));
    head->next->next->next->next = (link*) malloc (sizeof (link));
    head->next->next->next->next->next = (link*) malloc (sizeof (link));
    head->next->next->next->next->next->next = (link*) malloc (sizeof (link));
    head->next->next->next->next->next->next->next = (link*) malloc (sizeof (link));

    head->next->value = 1;
    head->next->next->value = 2;
    head->next->next->next->value = 3;
    head->next->next->next->next->value = 4;
    head->next->next->next->next->next->value = 5;
    head->next->next->next->next->next->next->value = 6;
    head->next->next->next->next->next->next->next->value = 7;

    head->next->next->next->next->next->next->next->next = head->next->next;

    if (panhuan (head)) {
        cout << "Have Hoop " << endl;
        cout << "Length of Hoop is : " << huanChang (head) << endl;
        cout << "In Hoop point value is : " << InNode (head) << endl;
        cout << "sum length is : " << InNode (head) + huanChang (head) - 1 << endl;
    } else {
        cout << "No Hoop" << endl;
    }

    //print (head);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值