鍊錶 Linked List 之環形鍊錶

2021-10-21 01:58:46 字數 3791 閱讀 1733

josephu 問題為:設編號為1,2,… n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m 的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。

用乙個不帶頭結點的迴圈鍊錶來處理josephu 問題:先構成乙個有n個結點的單迴圈鍊錶,然後由k結點起從1開始計數,計到m時,對應結點從鍊錶中刪除,然後再從被刪除結點的下乙個結點又從1開始計數,直到最後乙個結點從鍊錶中刪除演算法結束。

josephu問題為:設編號為1,2,… nn個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m 的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。

n = 5 , 即有5個人 

k = 1, 從第乙個人開始報數

m = 2, 數2下

構建乙個單向的環形鍊錶思路

先建立第乙個節點, 讓first指向該節點,並形成環形

後面當我們每建立乙個新的節點,就把該節點,加入到已有的環形鍊錶中即可.

遍歷環形鍊錶

先讓乙個輔助指標(變數)curboy,指向first節點

然後通過乙個while迴圈遍歷 該環形鍊錶即可curboy.next == first結束

根據使用者的輸入,生成乙個小孩出圈的順序

n = 5 , 即有5個人

k = 1, 從第乙個人開始報數

m = 2, 數2下

需求建立乙個輔助指標(變數)helper, 事先應該指向環形鍊錶的最後這個節點. 補充: 小孩報數前,先讓firsthelper移動k - 1

當小孩報數時,讓firsthelper指標同時 的移動m - 1

這時就可以將first指向的小孩節點 出圈first = first .nexthelper.next = first

原來first指向的節點就沒有任何引用,就會被**

出圈的順序2->4->1->5->3

一直丟手絹

package com.atguigu.linkedlist;

/** * classname:

* description:

* date: 2021-02-19 15:22

* @project data_algorithm

* @package com.atguigu.linkedlist

*/public

class

josepfu

}// 建立乙個環形的單向鍊錶

class

circlesinglelinkedlist

boy curboy = null;

// 輔助指標,幫助構建環形鍊錶

// 使用for來建立我們的環形鍊錶

for(

int i =

1; i <= nums; i++

)else}}

// 遍歷當前的環形鍊錶

public

void

showboy()

// 因為first不能動,因此我們仍然使用乙個輔助指標完成遍歷

boy curboy = first;

while

(true

) curboy = curboy.

getnext()

;// curboy後移}}

// 根據使用者的輸入,計算出小孩出圈的順序

/** *

* @param startno

* 表示從第幾個小孩開始數數

* @param countnum

* 表示要數幾下

* @param nums

* 表示最初有多少小孩在圈中

*/public

void

countboy

(int startno,

int countnum,

int nums)

// 建立要給輔助指標,幫助完成小孩出圈

boy helper = first;

// 需求建立乙個輔助指標(變數) helper , 事先應該指向環形鍊錶的最後這個節點

while

(true

) helper = helper.

getnext()

;}//小孩報數前,先讓 first 和 helper 移動 k - 1次

for(

int j =

0; j < startno -

1; j++

)//當小孩報數時,讓first 和 helper 指標同時 的移動 m - 1 次, 然後出圈

//這裡是乙個迴圈操作,知道圈中只有乙個節點

while

(true

)//讓 first 和 helper 指標同時 的移動 countnum - 1

for(

int j =

0; j < countnum -

1; j++

)//這時first指向的節點,就是要出圈的小孩節點

system.out.

printf

("小孩%d出圈\n"

, first.

getno()

);//這時將first指向的小孩節點出圈

first = first.

getnext()

; helper.

setnext

(first);//

} system.out.

printf

("最後留在圈中的小孩編號%d \n"

, first.

getno()

);}}

// 建立乙個boy類,表示乙個節點

class

boypublic

intgetno()

public

void

setno

(int no)

public boy getnext()

public

void

setnext

(boy next)

}

鍊錶之環形鍊錶

leetcode 141 easy 定義兩個指標slow和fast,只要slow指標追上每次走兩步的fast指標的話就有環,否則就沒!package linkedlist public class main0141環形鍊錶 class solution141 slow slow.next fast ...

鍊錶之環形鍊錶

上題目 leetcode 141 簡單 總體思路 雙指標,即通過使用一快一慢不同速度的兩個指標來遍歷鍊錶,如果有環,快的總會與慢的相遇。上 1 class solution 2def has cycle self,head 3 4 type head listnode 5 rtype bool 6 ...

LinkedList 鍊錶

線性表是一種簡單的資料結構,其主要特點是元素之間存在 一對一 的關係,除去第乙個元素,每個元素都存在唯一乙個 前驅節點 除去最後乙個元素都存在唯一乙個 後繼節點 簡單的線性表有 陣列 單鏈表 雙向鍊錶 靜態鍊錶等。順序表 陣列 優缺點 陣列不僅邏輯上,物理上位置也相鄰,可隨機訪問,但刪除或插入元素時...