`

几个链表相关问题

 
阅读更多

 

一、约瑟夫环问题

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。例如:n = 9,k = 1,m = 5

      主要思路:构建一个list,将n个人放入list中,规定开始位置k,开始遍历,每执行m次,将当前元素移除list,递归循环执行,直到list.size为零。以下为主要的两个方法的代码:

public static void process(int n,int k,int m) {
      // 构建一个list,存放人数
            LinkedList<Integer> list = new LinkedList<Integer>();
            for (int i = 0; i < n; i++) {
               if (i + k > n) {
               list.add(i + k - n);
          } else {
            list.add(i + k);
  }
}
      int count = 1;// 记录数的人数
      CycleRemove(list,count,m);
}

 

      public static void CycleRemove(LinkedList<Integer> list,int count,int m) {
            int len = list.size();
            if (len > 1) {
               for (int i = 0; i < len; i++) {
               if (count == m) {// 第m个时,remove
                  removedStr.append(list.get(i)).append(",");
                  list.remove(i);
                  len = list.size();
                  i--;
                  count = 0;
}
                  count++;
}
                  CycleRemove(list,count,m);
} else {
                  if (len != 0) {
                  removedStr.append(list.get(0)).append(",");
   }
  }
 }

 二、单链表排序

主要思路:比较每两个相邻值得大小,list排序

 

public static void main(String []args)  
   {  
        Comp c1 = new Comp(3,3);  
        Comp c2 = new Comp(1,1);  
        Comp c3 = new Comp(5,3);  
        Comp c4 = new Comp(4,3);  
          
        TreeSet<Comp>treeSet1 = new TreeSet<Comp>();     
        for (Comp comp : treeSet1) {  
            System.out.println(comp);  
        }  
          
        ArrayList<Comp> list = new ArrayList<Comp>();  
        list.add(c1);  
        list.add(c2);  
        list.add(c3);  
        list.add(c4);  
        Collections.sort(list);  
        for (Comp comp : list) {  
            System.out.println(comp);  
        }  
         
   }  

  三、判断单链表是否有环

主要思路:给定起始位置,给每个结点标记,给定两个结点NodeA,NodeB,每循环一次NodeA前进两个结点,NodeB前进一个结点,若有环,必相遇,即结点标记相同。

public class CircleJudge {
//	给定一个单链表,试判断该单链表有无存在环。
//	算法的思想是设定两个指针p, q,其中p每次向前移动一步,q每次向前移动两步。
//	那么如果单链表存在环,则p和q相遇;否则q将首先遇到null。
	
	ListNode root = new ListNode("root");
	public static void main(String arg []){
		CircleJudge cj = new CircleJudge();
		cj.CreateList();
	}
	//建立长度为10的链表,前一个结点指向下一结点,形成一个闭环
	public void CreateList(){
		ListNode  Node[] =new ListNode[10];
        Node[0] = root;
		for(int i = 1;i<Node.length;i++){
			Node[i] = new ListNode("Node"+i);
			Node[i-1].next = Node[i] ;
	} 
		Node[9].next = root;
		circle();
	}
	
	//建立两个结点分别每次前进一步和两步,若相遇则输出链表有环
	public void circle(){
		ListNode NodeA = root;
		ListNode NodeB = root; 
		while(true){
			NodeA = NodeA.next;
			NodeB = NodeB.next.next;
			if(NodeA.str.equals(NodeB.str)){
				System.out.println("该链表有环,程序结束");
				break;
			}
		}
	}
	
	//匿名内部结点类
	class ListNode {
	     //定义数据和指针属性,str用于标记结点验证结点是否相同,next为指针
		public String str;
		public ListNode next;
		
		//构造方法
		public ListNode(String str){
			this.str=str;
		}
	}
}

 

分享到:
评论

相关推荐

    两个链表求交集(链表基础练习)

    本题目的核心是利用链表的基本操作找到两个链表的交集,这是一个常见的算法问题,对于理解和掌握链表的操作具有很高的价值。 首先,我们需要了解链表的基本操作,包括创建链表、插入节点、删除节点和遍历链表。在...

    单行链表与双向链表问题实例

    而双向链表的插入操作通常在O(1)时间内完成,如果已知前驱或后继节点,因为只需要调整几个指针即可。但如果需要查找特定位置的节点,仍然可能需要O(n)的时间。 在实际应用中,选择单向链表还是双向链表取决于具体...

    关于链表的几个函数

    根据给定的文件信息,我们可以总结出以下几个与链表相关的知识点: ### 1. 链表的基本结构 链表是一种常见的线性数据结构,它通过指针将一系列的节点连接起来。每个节点通常包含两部分:数据域(用于存储实际的...

    用c语言链表排列数据,可以随便输入几个数并进行排序

    在本程序中,`createlist`函数用于创建一个链表。该函数接收一个整数参数`n`,表示链表中节点的数量。首先定义了一个结构体`struct node`来表示链表中的节点。每个节点包含两个成员:一个整型变量`data`用于存储数据...

    实验报告2 链表倒置问题.doc

    2. **创建链表**:使用 `CreatList_L` 函数创建一个链表。 3. **倒置链表**:实现 `change` 函数来进行链表的倒置。 4. **循环处理**:遍历链表,每次将当前节点与其对应的对称节点进行交换,直到遍历至链表中间。 ...

    一个异质链表类的实现

    /* 题目: 大学中的人员分三类 :学生,教师和职员,他们的基本信息如下: ...链表类,此类用来存放这几个不同类的对象,并将链表类 list 声明为所有这些 类的友元,使它们可以访问它们的私有成员。*/

    C语言 链表使用示例

    然后,我们需要编写几个基本操作函数,包括: 1. 初始化链表:创建一个空链表,通常设置头节点为NULL。 2. 插入节点:在链表中插入一个新的学生记录。这需要找到合适的位置(例如按ID排序),然后将新节点连接到...

    C语言实现异质链表

    C语言实现异质链表

    判断链表是否相交的几种算法1

    本篇文章讨论了四种判断两个单链表是否相交的算法,这些算法主要应用于解决《编程之美》中的相关问题。 **解法一**是最直观的方法,称为“两两遍历法”。它通过分别遍历两个链表h1和h2,寻找h1中的节点是否出现在h2...

    链表相关例题.docx

    ### 链表相关知识点详解 #### 一、链表基础概念 链表是一种常见的线性数据结构,它通过一组节点来表示一个序列。每个节点包含数据和指向下一个节点的指针。根据链接方式的不同,链表可以分为单向链表、双向链表和...

    大数阶乘 双向链表

    这个算法可以分为以下几个步骤: - 分别遍历两个链表,记录当前遍历到的位数。 - 将这两个位数相乘,得到中间结果。 - 将中间结果累加到对应位置的积,需要考虑进位。 - 将结果更新到新的链表中,即大数阶乘的...

    链表基础问题(斯坦福大学教程)

    本教程由Nick Parlante编写,涵盖了基本的链表代码技术和各种难度级别的18个链表问题。这些问题不仅帮助读者了解链表,更重要的是帮助他们培养处理复杂指针算法的能力。尽管现代编程语言和工具使得链表在日常编程中...

    在链表操作中,"重排链表" 是一个常见的问题,其目标是将链表中的节点重新排列成这样的顺序:链表的前半部分包含原始链表中的前 n/

    为了解决这个问题,我们可以采用以下几个步骤: 找到链表的中点:使用快慢指针法来找到链表的中点。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针就位于链表的中点。 反转链表的后半...

    单向链表 代码架构

    在给定的“单向链表 代码架构”中,我们可以期待找到以下几个关键知识点: 1. **链表节点结构**:通常,链表节点由数据域(用于存储数据)和指针域(用于存储指向下一个节点的引用)组成。例如,在C++中,可以定义...

    第一课 链表

    接下来的几个问题分别是: 2. **链表中间段逆序**:这要求对链表的一部分进行逆序,可能需要先找到中间节点,然后应用逆序操作。 3. **两个排序链表的合并**:将两个已排序的链表合并成一个有序链表,可以通过比较...

    C#实现双向链表C#,.net 链表 双向链表

    为了实现双向链表,我们需要关注以下几个方面: #### 初始化链表 链表的初始化涉及到设置 `Head` 和 `Tail` 指针为 `null`,并确保 `lstcnt` 的初始值为零。 #### 插入节点 在双向链表中插入新节点时,我们不仅...

    多线程下写入链表的同步问题

    ### 多线程环境下链表写入的同步问题解析 #### 一、引言 在多线程编程中,同步机制对于确保数据的一致性和程序的正确性至关重要。尤其是在链表这种动态数据结构上进行并发操作时,如果不采取适当的同步手段,可能...

    算法链表.docx

    本文将深入探讨链表的几个关键操作:链表反转、合并有序列表、新增节点、删除节点、判断链表是否有环以及找到链表的中间节点。我们将使用Java语言进行讨论。 首先,链表不同于数组,它不依赖于内存中的连续空间。每...

Global site tag (gtag.js) - Google Analytics