一、约瑟夫环问题
已知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. 链表的基本结构 链表是一种常见的线性数据结构,它通过指针将一系列的节点连接起来。每个节点通常包含两部分:数据域(用于存储实际的...
在本程序中,`createlist`函数用于创建一个链表。该函数接收一个整数参数`n`,表示链表中节点的数量。首先定义了一个结构体`struct node`来表示链表中的节点。每个节点包含两个成员:一个整型变量`data`用于存储数据...
2. **创建链表**:使用 `CreatList_L` 函数创建一个链表。 3. **倒置链表**:实现 `change` 函数来进行链表的倒置。 4. **循环处理**:遍历链表,每次将当前节点与其对应的对称节点进行交换,直到遍历至链表中间。 ...
/* 题目: 大学中的人员分三类 :学生,教师和职员,他们的基本信息如下: ...链表类,此类用来存放这几个不同类的对象,并将链表类 list 声明为所有这些 类的友元,使它们可以访问它们的私有成员。*/
然后,我们需要编写几个基本操作函数,包括: 1. 初始化链表:创建一个空链表,通常设置头节点为NULL。 2. 插入节点:在链表中插入一个新的学生记录。这需要找到合适的位置(例如按ID排序),然后将新节点连接到...
C语言实现异质链表
本篇文章讨论了四种判断两个单链表是否相交的算法,这些算法主要应用于解决《编程之美》中的相关问题。 **解法一**是最直观的方法,称为“两两遍历法”。它通过分别遍历两个链表h1和h2,寻找h1中的节点是否出现在h2...
### 链表相关知识点详解 #### 一、链表基础概念 链表是一种常见的线性数据结构,它通过一组节点来表示一个序列。每个节点包含数据和指向下一个节点的指针。根据链接方式的不同,链表可以分为单向链表、双向链表和...
这个算法可以分为以下几个步骤: - 分别遍历两个链表,记录当前遍历到的位数。 - 将这两个位数相乘,得到中间结果。 - 将中间结果累加到对应位置的积,需要考虑进位。 - 将结果更新到新的链表中,即大数阶乘的...
本教程由Nick Parlante编写,涵盖了基本的链表代码技术和各种难度级别的18个链表问题。这些问题不仅帮助读者了解链表,更重要的是帮助他们培养处理复杂指针算法的能力。尽管现代编程语言和工具使得链表在日常编程中...
为了解决这个问题,我们可以采用以下几个步骤: 找到链表的中点:使用快慢指针法来找到链表的中点。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针就位于链表的中点。 反转链表的后半...
在给定的“单向链表 代码架构”中,我们可以期待找到以下几个关键知识点: 1. **链表节点结构**:通常,链表节点由数据域(用于存储数据)和指针域(用于存储指向下一个节点的引用)组成。例如,在C++中,可以定义...
接下来的几个问题分别是: 2. **链表中间段逆序**:这要求对链表的一部分进行逆序,可能需要先找到中间节点,然后应用逆序操作。 3. **两个排序链表的合并**:将两个已排序的链表合并成一个有序链表,可以通过比较...
为了实现双向链表,我们需要关注以下几个方面: #### 初始化链表 链表的初始化涉及到设置 `Head` 和 `Tail` 指针为 `null`,并确保 `lstcnt` 的初始值为零。 #### 插入节点 在双向链表中插入新节点时,我们不仅...
### 多线程环境下链表写入的同步问题解析 #### 一、引言 在多线程编程中,同步机制对于确保数据的一致性和程序的正确性至关重要。尤其是在链表这种动态数据结构上进行并发操作时,如果不采取适当的同步手段,可能...
本文将深入探讨链表的几个关键操作:链表反转、合并有序列表、新增节点、删除节点、判断链表是否有环以及找到链表的中间节点。我们将使用Java语言进行讨论。 首先,链表不同于数组,它不依赖于内存中的连续空间。每...