手撕C語言題典——環形鏈表的約瑟夫問題

目錄

前言?

一.故事背景

二.題目?

?編輯三.思路

1)數組

?編輯2) 循環鏈表

四.代碼實現?


搭配食用更佳哦~~

數據結構之單單單——鏈表-CSDN博客

數據結構之單鏈表的基本操作-CSDN博客

前面學了單鏈表的相關知識,我們來嘗試做一下關于順序表的經典算法題~?

前言?

? ? ? 這次是牛客上的一道題,是循環鏈表的經典應用,講的是一個老六用自己的聰明才智躲過被殺的命運。

環形鏈表的約瑟夫問題_牛客題霸_牛客網 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a?tpId=196&tqId=37145&ru=/exam/oj

一.故事背景

? ? ? ? Josephus 問題是一個古老而著名的問題,最早的記載來自猶太歷史學家弗拉維奧·約瑟夫斯(FlaviusJosephus),他在猶太戰爭中被羅馬軍隊包圍,為了不被俘虜,他和他的 39 個戰友決定自殺,但是他們并不想自己親手殺死自己,于是決定站在一個圓圈里,從一個人開始,每報數到第 14 個人,第 14 個人就會被殺掉,然后從下一個人開始重新報數,直到最后只剩下一個人,那個人就可以幸存。

Josephus(真是純老六)要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。

二.題目?

三.思路

1)數組

?用數組的話我們需要先申請空間,然后再計數,每記到2就嘎掉它,可以給他賦值一個數組不存在的數比如 0 ,當報數到最后一個時我們需要返回數組最開始也就是下標為 0的時候,當剩下最后一個時就得到了活著的那一個,因為數組比較麻煩而且本篇要講的是環形鏈表,所以這個代碼就不寫了,僅敘述一下思路

2) 循環鏈表

? ? ?顧名思義,循環鏈表就是把原本線性的鏈表成環,如何實現呢?我們都知道鏈表尾節點指針指向NULL,所以我們把這個指針指向頭節點就可以搞出一個循環鏈表。

? 和上一個思路一樣,我們依舊讓他們循環報數,報到 2 的嘎掉,在刪除這個節點的同時我們需要將前一個節點的 next 指針指向被嘎節點的下一個指針,這樣才能使鏈表連續起來

雖然畫的蠻亂的,大致意思一樣,最終結果就是第三個節點自己指向自己。

總結思路就兩步:

  • 創建帶環鏈表
  • 計數,嘎節點

四.代碼實現?

/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param n int整型 * @param m int整型 * @return int整型*/
#include <stdlib.h>
typedef struct ListNode ListNode;
//創建節點
ListNode* buyNoded(int x){ListNode* node = (ListNode*)malloc(sizeof(ListNode));if (node == NULL) {exit(1);}node->val = x;node->next = NULL;return node;
}
//創建帶環鏈表
ListNode* createCircle(int n){ListNode* phead = buyNoded(1);ListNode* ptail = phead;for (int i = 2; i<= n; i++) {ptail->next = buyNoded(i);ptail = ptail->next;}ptail->next = phead;return ptail;
}
int ysf(int n, int m ) {// write code here//創建帶環鏈表ListNode* prev = createCircle(n);ListNode* pcur = prev->next;int count = 1;//當鏈表中只有一個節點的情況while (pcur->next != pcur) {if (count == m) {//銷毀pcur節點prev->next = pcur->next;free(pcur);pcur = prev->next;count = 1;}else {//此時不需要銷毀節點prev = pcur;pcur = pcur->next;count++;}}//剩下的就是要返回的值了return pcur->val;
}

這道題到這就結束啦~雖然循環鏈表寫起來比較麻煩要封裝好多函數,但封裝完就好寫啦~~

? ? 🎈🎈完結撒花🎈🎈??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12038.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos 把nginx更新到最新版本

yum install epel-release # 添加 EPEL 軟件倉庫&#xff0c;這是 Nginx 官方軟件倉庫的依賴項 yum install yum-utils # yum-utils 包含了 yum-config-manager 工具&#xff0c;它可以讓您輕松地啟用、禁用或配置 yum 軟件倉庫 vi /etc/yum.repos.d/nginx.repo # 增加以下內容…

灌區信息化管理平臺系統包含哪些內容?(全面介紹)

政策背景 2022年12月29日&#xff0c;水利部啟動48處大中型灌區開展數字孿生灌區先行先試建設。 2023年2月24日&#xff0c;《2023年農村水利水電工作要點》:2023年農村水利水電工作的總體思路包括:緊盯保障國家糧食安全&#xff0c;加快推進大中型灌區現代化改造&#xff0c;…

Linux repo包安裝Nginx

Linux repo包安裝Nginx 1. 將nginx.repo 文件拷貝到 /etc/yum.repos.d 目錄2.找到原來的NGINX配置文件打包備份3.執行Nginx安裝命令4. 重啟 nginx -s reload5. 查看Nginx版本 1. 將nginx.repo 文件拷貝到 /etc/yum.repos.d 目錄 cp nginx.repo /etc/yum.repos.d2.找到原來的…

jQuery 入門:輕松創建與插入節點

在Web開發中&#xff0c;動態地創建和管理DOM&#xff08;文檔對象模型&#xff09;節點是一項基本且強大的技能。jQuery&#xff0c;作為JavaScript的一個流行庫&#xff0c;以其簡潔的API簡化了這一過程。本文將通過一個簡單的示例&#xff0c;介紹如何使用jQuery來創建新的D…

【力扣一輪】鏈表-刪除鏈表指定值的元素

刪除鏈表指定元素 力扣鏈接 代碼隨想錄題解 分為兩個版本&#xff0c;一個是帶有虛擬頭節點&#xff0c;一個是不帶。 無論是帶有還是不帶有&#xff0c;我都遇到了這幾個問題&#xff1a; ①while循環時的判斷&#xff0c;首先要判斷當前節點是否為空&#xff0c;接著才能…

bmi088-linux驅動(I2C)

電氣特性&#xff1a; 在正常工作時&#xff0c;gyro 工作電流為5mA&#xff0c;acc 工作電流為150uA。 SPI 時鐘和數據電平范圍 0 -3.6 結構框圖如下&#xff1a; 硬件連接圖如下&#xff1a; note&#xff1a; 1. 通過PS引腳選擇通訊協議&#xff0c;上拉引腳則選擇的是I2C…

系統定期執行命令的方法

系統定期執行命令的方法 一、進入超級用戶下 執行命令&#xff1a;sudo su 二、添加要執行的命令 例子&#xff1a;每天0點執行一次myapp.sh命令 先后輸入&#xff1a;crontab -e、 1、 回車 設置每天0點執行一次myapp.sh操作&#xff0c;需要寫絕對路徑 含義&#xff1…

離線修復.dll,Microsoft Visual C++

在安裝mysql時遇到下面的問題&#xff0c;如果是有網絡的情況下微軟管網下載安裝就行了&#xff0c;用的服務器不允許連接互聯網。 后面經過尋找&#xff0c;找到了一個修復工具&#xff0c;可一次修復所有的問題&#xff0c;特別好用分享給寶子們。 下載鏈接&#xff1a;http…

樹莓派 4B putty遠程連接登錄顯示拒絕訪問,密碼修改

putty顯示拒絕訪問 可能是樹莓派的ip沒有找到正確的 在下載系統鏡像的時候&#xff0c;會提示設置wifi 這里設置的WiFi和密碼需記住&#xff0c;主機名也需記住 可以在手機打開熱點&#xff08;將熱點的賬號和密碼改為跟你設置的wifi一樣的&#xff09; 可以在手機后臺查看…

頁面埋點H5 大數據uniapp 按需要更改代碼就行

邏輯思路 跳轉頁面前&#xff0c;記錄當前頁面的信息停留的時長以及各種信息&#xff0c;然后等走的時候再將記錄的信息發送出去 1.記錄當前頁面信息的函數 // 埋點通用接口 // triggerType: 必傳 類型 entryStr(進入) || leaveStr(離開) || String:自定義事件描述 // pageU…

微信小程序支付教程

微信小程序支付教程 Person&#xff1a; 微信小程序支付有幾種版本&#xff0c;分別是什么&#xff0c;寫一個詳細教程介紹下 ChatGPT&#xff1a; 微信小程序支付主要有兩種版本&#xff0c;分別為&#xff1a;JSSDK版本&#xff08;v1.0&#xff09;和WeixinJSBridge版本&…

超寬輸送帶耐熱性能怎么樣

超寬輸送帶耐熱性能解析 隨著工業領域的不斷發展和技術革新&#xff0c;超寬輸送帶的應用越來越廣泛。這種輸送帶在冶金、建筑、化工等多個行業中發揮著至關重要的作用&#xff0c;特別是在高溫環境下&#xff0c;其耐熱性能更是備受關注。那么&#xff0c;超寬輸送帶的耐熱性…

解釋下泛型擦除

在Java中&#xff0c;泛型擦除&#xff08;Type Erasure&#xff09;是Java泛型實現的一個重要概念。由于Java的泛型是在編譯時實現的&#xff08;稱為編譯時類型檢查&#xff09;&#xff0c;而在運行時&#xff0c;Java虛擬機&#xff08;JVM&#xff09;并不支持泛型&#x…

HDFS小文件優化方法

1、HDFS小文件弊端 HDFS上每個文件都要在namenode上建立一個索引&#xff0c;這個索引的大小約為150byte&#xff0c;這樣當小文件比較多的時 候 &#xff0c;就會產生很多的索引文件&#xff0c;一方面會大量占用namenode的內存空間 &#xff0c;另一方面就是索引文件過大是的…

Linux —— 線程控制

Linux —— 線程控制 創建多個線程線程的優缺點優點缺點 pthread_self進程和線程的關系pthread_exit 線程等待pthread_ join線程的返回值線程分離pthread_detach 線程取消pthread_cancel pthread_t 的理解 我們今天接著來學習線程&#xff1a; 創建多個線程 我們可以結合以前…

【離散數學】偏序關系中蓋住關系的求取及格論中有補格的判定(c語言實現)

實驗要求 求n的因子函數 我們將n的因子存入數組中&#xff0c;n的因子就是可以整除n的數&#xff0c;所以我們通過一個for循環來求。返回因子個數。 //求n的因子,返回因子個數 int factors(int arr[], int n) {int j 0;for (int i 1; i < n; i){if (n % i 0){arr[j] i…

C++反向迭代器

C反向迭代器 反向迭代器是用正向迭代器適配實現的&#xff0c;本質是寫一個反向迭代器的類模板&#xff0c;給編譯器傳不同的容器的正向迭代器實例化&#xff0c;編譯器去實例化出各種類模板對應的反向迭代器。 #pragma once namespace my_reverse_iterator {template<cla…

代碼隨想錄算法訓練營第五十三天| 1143.最長公共子序列,1035.不相交的線,53. 最大子序和

目錄 題目鏈接&#xff1a;1143.最長公共子序列 思路 代碼 題目鏈接&#xff1a; 1035.不相交的線 思路 代碼 題目鏈接&#xff1a; 53. 最大子序和 思路 代碼 總結 題目鏈接&#xff1a;1143.最長公共子序列 思路 ①dp數組&#xff0c;dp[i][j]表示[0,i-1]的text1和…

軟件測試面試78問

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 1、問&#xff1a;你在測試中發現了一個bug&#xff0c;但是開發經理認為這不是一個bug&#xf…

關于使用git拉取gitlab倉庫的步驟(解決公鑰問題和pytho版本和repo版本不對應的問題)

先獲取權限&#xff0c;提交ssh-key 虛擬機連接 GitLab并提交代碼_gitlab提交mr-CSDN博客 配置完成上訴步驟之后&#xff0c;執行下列指令進行拉去倉庫的內容 sudo apt install repo export PATHpwd/.repo/repo:$PATH python3 "實際路徑"/repo init -u ssh://gitxx…