单链表相关问题

/*
判断单链表是否存在环
1)暴力:双层循环遍历(n^2)
2)双指针:快指针fast=NULL,慢指针slow=NULL
int judge(link head)
{
    if(NULL==head) return false;
    link fast = head,
         slow = head;
    while(slow!=NULL && fast!=NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;
}
计算带环单链表的长度
int count(link head)
{
    if(NULL==head)
        return false;
    link fast = head,
         slow = head;
    while(slow!=NULL && fast!=NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow==fast)
        {
            flag = true;
            break;
        }
    }
    if(flag)
    {
        int ans = 1;
        slow = slow->next;
        while(slow!=fast)
        {
            ans++;
            slow = slow->next;
        }
        return ans ;
    }
    return false;
}
查找单链表中环的入口
设环长为n,非环形部分长度为m
link find(link head)
{
    int flag = false;
    if(NULL==head) return false;
    link fast = head,
         slow = head;
    while(slow!=NULL && fast!=NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow==fast)
        {
            flag=true;
            break;
        }
    }
    if(flag)
    {
        slow = head;
        while(slow!=fast)
        {
            slow = slow->next;
            fast = fast->next;
        }
        return slow;
    }
    return NULL;
}

原文地址:https://www.cnblogs.com/Shallow-dream/p/11767269.html

时间: 2024-10-13 23:49:18

单链表相关问题的相关文章

<笔试><面试>C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)

判断两链表是否相交,求交点(假设链表不带环) 判断两链表是否相交,求交点(假设链表可能带环) RingEntry_Point()等函数见前篇. SListNode* Intersect(SListNode *&L, SListNode *&M)//判断两链表是否相交,求交点(假设链表不带环) {  //思路:若不带环,只有相交/不想交两种情况  // 与RingEntry_Point()函数方法相同:  //     求两个链表长度之差K,再令一个指针从长链表开始先走K步,令另一个指针从短

leetcode 单链表相关题目汇总

  leetcode-19-Remove Nth From End of List—移除链表中倒数第n个元素 leetcode-21-Merge Two Sorted Lists—两个已排序链表归并 leetcode-23-Merge k Sorted Lists—k个已排序链表归并 leetcode-24-Swap Nodes in Pairs—链表中元素两两一组交换 leetcode-25-Reverse Nodes in K-Group—链表中元素k个一组逆序 leetcode-61-Ro

单链表相关操作

struct ListNode { int val; ListNode *next; }; ListNode* createListFromHead() { ListNode *list = (ListNode*)malloc(sizeof(ListNode)); list->next = NULL; ListNode *s; int x; while (cin >> x) { s = (ListNode*)malloc(sizeof(ListNode)); s->val = x;

单链表总结篇

[基本概念]单链表即单向链表,数据结构为一个接一个的结点组成,每个结点有两个成员,一个数据域一个指向下一个结点的指针,如下: struct Node { int data; struct Node *next; }; 单链表基本操作包括链表初始化.插入.删除,其中初始化操作是指让单链表存在一个头结点,其数据域随机,头结点指向下一个结点,每次访问都要从头结点开始访问,插入结点方式有两种,尾部插入和结点前部插入,尾部插入很简单与正常的输入顺序一致,而前部插入需要时常变动头结点的指针,始终让他指向新插

单链表的环相关问题

给定一个单链表,只给出头指针h: 1. 如何判断是否存在环? 证明: slow首次在A点进入环路时,fast一定在环中的B点某处.设此时slow距head长为x,B点距A点长度为y,环周长为s.因为fast和slow的步差为1,所以slow前行距离为y的时候,恰好会被fast在M点追上.因为y<s,所以slow尚未完成一次遍历. //判断单链表是否有环 public static boolean hasCycle(ListNode head) { if(head == null || head.

判断单链表是否有环相关问题(转载加总结)

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

单链表 --- 环相关问题(是否存在环、是否相交)

一.两单链表皆不带环 ---> 是否存在"环"及 环长 方法:借助于 快慢指针 ,两指针是否存在相遇情况(存在,即存在环:反之,不存在) 环长:相遇时开始计算慢指针所走过距离,即为环长 int IsCycle(ListNode *_head)  //是否存在环 及 环长(两链表不带环) { ListNode *fast=_head; ListNode *slow=_head; while (fast&&fast->_next&&fast-&g

单链表的相关操作

#ifndef _SLIST_H #define _SLIST_H #ifdef __cplusplus extern "C" { #endif /*******1. 不带头结点的单链表*****/ /***** *@链表结点结构定义 *@ m_data:数据 *@m_pNext:指向下一结点的指针 ***/ struct listNode { int m_data; listNode* m_pNext; }; /******* *@ 用数组array初始化链表,数组元素个数为n *@

Java数据结构系类之——链表(1):单链表及相关常用操作

package LinkList; public class Node<T> { public T data;//数据域 public Node next;//结点域 //默认构造方法 public Node(){ } //带参构造方法,非头结点初始化 public Node(T data,Node next){ this.data=data; this.next=next; } //头结点初始化 public Node(Node next){ this.next=next; } //显示结点