链表的中点,是否有环,有环时环的起点,环的长度,链表的长度

  1. 查找链表的中点
LinkNode* middle(LinkNode* head)
{
     LinkNode *fast = head;       //快慢指针起点相同
     LinkNode *slow = head;
     
     //使用快慢指针
     while(fast && fast->next)
     {
          slow = slow->next;
          fast = fast->next->next;
     }
     
     if(fast)                  //根据结束条件  判断  中间节点的位置
             return slow;
     else  
             return slow->next;
      
}

2.  判断链表有环

bool isCircle(LinkNode* head)
{
     LinkNode *fast = head;
     LinkNode *slow = head;
     
     while(fast && fast->next)
     {
         slow = slow->next;
         fast = fast->next->next;
         
         if(slow == fast)  return true;
     }
     
     return false;
}

3.  计算环的起点, 链表长度, 还的环的长度

void  Circle(LinkNode * head)
{
    int slowStep;   //slow 走过的步数
    int pos;        //从链表开始记录的步数
    
    LinkNode *slow = head;
    LinkNode *fast = head;
    
    slowStep = 1;
    while(fast && fast->next)
    {
         slow = slow->next;
         fast = fast->next->next;
         
         slowStep++;
         if(slow == fast)  break;
    }
    
    pos = 1;
    LinkNode *p = head;
    while(p != slow)   //同时从第一个相交的点 和  起点开始遍历
    {
        p = p->next;
        slow = slow->next;
        
        pos++;
    }
    
    /*
       环的起点    p;
       链表的长度  slowStep+pos-1;
       环的长度    slowSteps; 
    */
     
     return;
    
}
//方法2 根据hash查找环的起点
LinkNode * CircleStart(LinkNode* head)
{
     unoedered_set<LinkNode*> hash;
     
     LinkNode* p = head;
     while(p)
     {
          if(hash.find(p) == hash.end())
          {
               hash.insert(p);
          }else
               break;
          p = p->next;
     }
     
     return p;
}
//方法2 计算环的长度
int CircleLength(LinkNode* head)
{
     LinkNode *fast = head;
     LinkNode *slow = head;
     
     while(fast && fast->next)
     {
         slow = slow->next;
         fast = fast->next->next;
         
         if(slow == fast)  break;
     }
     
     
     int lenght = 1;
     while(true)
     {
         slow = slow->next;
         fast = fast->next->next;
         length++;
         
         if(slow == fast)  break;  //再一次相遇时   slow 走了一圈,fast走了两圈。
     }
     
     return length;
     
}
时间: 2024-10-10 15:18:27

链表的中点,是否有环,有环时环的起点,环的长度,链表的长度的相关文章

链表操作---找到链表的中点

在很多链表的算法中,常常需要找到链表的中点. 这里给出一种使用双指针,一次遍历链表就能找到链表中点的方法. 使用一个快指针,每次走两步,一个慢指针,每次走一步.等快指针走到链表底部的时候,慢指针正好走到中点. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ ListN

8.判断单链表是否有环(6形状)?如何找到环的“起始”点?如何知道环的长度?

8.判断单链表是否有环(6形状)?如何找到环的“起始”点?如何知道环的长度? 思路: 注意分析题意,题意并非是说单链表完全成O形状的环,而是说单链表成6形状的环. 首先判断是否有环:为此我们建立两个指针,从Head一起向前跑,一个步长为1,一个步长为2,用 while(直到步长2的跑到结尾){检查两个指针是否相等,直到找到为止.} 来进行判断. 原因是,在这场跑步中,结束循环有两种可能,其一是原来无环,所以2先跑到结尾,因为2比1快,二者不可能相等.其二是原来是有环的,因为这场赛跑永远没有z终点

leetcode链表--8、merge-two-sorted-list(按顺序合并两个已经排好序的链表)

题目描述 Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 解题思路: 1)定义l,每次l指向两个链表中小的那个节点,定义head为头指针,定义ptr,将l依次连成链表 2)两个链表均不为空,将其小的值赋给l 3)将其中节点多的那个链表剩余节点赋给l 4)每次l得到

接上一篇中记录Echarts进度环使用【不同状态不同进度环颜色及圈内文字】--采用单实例业务进行说明

接上一篇中记录Echarts进度环使用 此处处理不同状态下不同进度环颜色及圈内文字等的相关处理,采用实际案例源码说明 -----------------偶是华丽丽分割线--------------------------------------------------- 业务上此处拿一个有期限任务实例举例说明 业务简要说明: [任务按时间 可分为 未开始--进行中--已结束 3大状态//其中已开始任务中任务状态又需要根据完成情况(提交与否)显示对应圈内文字] 核心地方如图已标出 接下来我们可以自

召敖帕必环膳朴忱坡词问环瘸竞焦

http://weheartit.com/drbfvnbv95715/collections/51333830-2014-12-10 http://weheartit.com/vltptlnx13153/collections/51333841-2014-12-10 http://weheartit.com/jzffzprl91559/collections/51333848-2014-12-10 http://weheartit.com/hzrntxdj5919/collections/513

用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

一,用结点实现链表LinkedList,不用换JavaAPI的集合框架 import java.util.Scanner; public class Main { public static class Node { int data; Node next=null; public Node(int data){this.data=data;}; } public static class MyLinkedList { Node head=null; public MyLinkedList()

给定一个链表,删除链表的倒数第 n 个节点(已知该结点存在),并且返回链表的头结点。

思路: 找到倒数第n个结点的前一个结点,让该结点的后继为倒数第n个结点的后继 子问题:找到倒数第n个结点的前驱 1.有两个引用,第一个引用指向首节点,然后走n步 2.第二个结点指向首节点,此时两结点之间隔了n-1个结点,保持这样的距离,共同向后移动 3.当第一个引用到达尾节点时,第二个引用离尾节点有n-1个结点, 4.此时第二个结点为倒数第n+1个结点,即倒数第n个结点的前驱 特殊情况: 1.链表只有一个结点或者为空链表,直接返回空即可: 2.链表的长度刚好等于n,即删除首节点,第一个引用从头结

[数据结构与算法]给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

给定 1->2->3->4, 你应该返回 2->1->4->3. 这个题目一看很简单,就是让后驱节点指向前驱节点,然后前驱节点指向后驱节点的后驱节点,但是后驱的节点也需要交换,所以有点棘手.思路就是列举如下图 1 -> 2 -> X -> Y | | | left right aft 第一步: 初始化 preNode = right ,left,right , aft四个节点 指向第二步: right.next = left, pre.next = r

数据结构Java实现04----循环链表、仿真链表

数据结构Java实现04----循环链表.仿真链表 单向循环链表 双向循环链表 仿真链表 一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的长处是从链尾到链头比较方便.当要处理的数据元素序列具有环型结构特点时,适合于采用循环单链表. 和单链表相同,循环单链表也有带头结点结构和不带头结点结构两种,带头结点的循环单链表实现插入和删除操作时,算法实现较为