首先先了解如何判斷單鏈表中是否有環
環的定義:鍊錶中的尾節點指向了鍊錶中的某個節點。
方法一:使用p、q兩個指標,p一直往前走,q每次從頭往前走,當p等於q但是p、q移動的步數不相等的時候,存在環。
方法二:使用p、q兩個指標,p每次往前走一步,q每次往前走兩步,當存在p==q的時候,存在環。
迴圈鍊錶,只要將單鏈表的最後乙個指標域(空指標)指向鍊錶中第乙個結點即可(這裡之所以說第乙個結點而不說是頭結點是因為,如果迴圈單鏈表是帶頭結點的則最後乙個結點的指標域要指向頭結點;如果迴圈單鏈表不帶頭結點,則最後乙個指標域要指向開始結點)。
帶頭結點的迴圈單鏈表當head等於head->next時煉表為空;
不帶頭結點的迴圈單鏈表當head等於null時煉表為空。
namespace _001_線性表
get
}public t this[int index] => getele(index);
////// 在末端新增乙個新節點
//////
public
void
add(t item)
else
temp.next = newnode;
newnode.next = head;}}
////// 清空表元素
///public
void
clear()
////// 刪除鍊錶指定位置的元素
//////
///public t delete(int index)
this.head = head.next;
data=prenode.next.data;
prenode.next = this.head;
}else
prenode.next = prenode.next.next;
}return data;
}///
/// 找到鍊錶指定位置的元素
//////
///public t getele(int index)
return node.data;
}///
/// 獲取鍊錶長度
///
///
public
intgetlength()
else
return length;}}
////// 在鍊錶指定的位置插入乙個新節點
//////
///public
void
insert(t item, int index)
prenode.next = newnode;
newnode.next = this.head;
return;
}else
nodeatfnode= prenode.next;
prenode.next = newnode;
newnode.next = atfnode;}}
////// 鍊錶是否為空
//////
public
bool
isempty()
////// 根據給定的值查詢鍊錶中哪個元素為這個值,如果鍊錶中存在兩個元素值相同,則取排在鍊錶前面的元素
///
///
///
public
intlocate(t value)
else
}else
}return -1;}}
}迴圈鍊錶的目的是只要知道表中任一乙個節點的位址,就能遍歷表中其他任一節點。
相關題目
問題一:魔術師發牌問題
問題描述:魔術師利用一副牌中的13張黑牌,預先將他們排好後疊放在一起,牌面朝下。對觀眾說:「我不看牌,只數數就可以猜到每張牌是什麼,我大聲數數,你們聽,不信?現場演示。」魔術師將最上面的那張牌數為1,把他翻過來正好是黑桃a,將黑桃a放在桌子上,第二次數1,2,將第一張牌放在這些牌的下面,將第二張牌翻過來,正好是黑桃2,也將他放在桌子上,這樣一次進行,將13張牌全部翻出,準確無誤。
class solution1
}pnode.data = ++cur1;
//令下一張牌的牌值加1
count++;
//牌數為13張,從a~k,排完所有的牌則跳出迴圈
if (cur1 == 13)
break;
}//列印排好序的牌
printpoker(phead);
}///
/// 建立撲克牌並為其賦值
//////
撲克牌堆最上面的牌值
public poker createcirclelinklist()
;pnode = pnode.next;
}//給13張牌排序
sortpoker(ref phead);
return phead;
}///
/// 列印輸出撲克的牌值
//////
牌堆的第一張牌
private
void
printpoker(poker phead)
console.writeline();}}
問題二:拉丁方陣問題
拉丁方陣是一種m×n的方陣,方陣中恰有n中不同的元素,每種元素恰有n個,並且每種元素在一行和一列中切好出現一次。著名數學家和物理學家尤拉使用拉丁字母來作為拉丁方陣裡元素的符號,拉丁方陣因此而得名。
下圖為乙個3×3的拉丁方陣:12
3231
312
請寫出乙個演算法,當輸入乙個n的時候,可以輸出乙個n✖n的拉丁方陣,拉丁方陣的值從1到n
class solution2
; pnode = pnode.next;
}//把第一列新增進方陣中
list
.add(phead);
//方便把每一列新增進方陣中,只需每次把當前節點的下乙個節點加入方陣即可,因為是迴圈鍊錶,所以每一列的節點都會按照拉丁方陣分配
pnode = phead;
while (rows
< n)
return
list;
}public
void printladingmatrix(list
list)
console.writeline(pnode.
data);
}console.writeline();}}
下面為測試的**:
「` class program
} 下列為執行結果:
資料結構之迴圈鍊錶
迴圈鍊錶是資料結構中煉表的一種形式。相對於單向鍊錶,將單向鍊錶的尾結點的指標域指向該單向鍊錶的頭結點,就構成了迴圈鍊錶。可以這麼理解,單向鍊錶就是一張單程火車票,比如你要從北京坐火車去上海,路上經過濟南 南京,此時北京 濟南 南京 上海就構成了單向鍊錶的四個結點,如下圖所示。但是,單向鍊錶是有去無回...
資料結構之迴圈鍊錶
前面學習了鏈式結構鍊錶,鏈式結構鍊錶也有使用的侷限性。比如說我們經常碰到的迴圈關係,最經典的當然是約瑟夫問題了,那麼我們怎麼去解決約瑟夫問題呢?相信你看完本文章就會了,好了言歸正傳,我們生活中經常會遇到迴圈問題,例如,一年的12個月,春夏秋冬交替,這些迴圈關係怎麼在我們的程式體現出來,少廢話,上 第...
資料結構之 迴圈鍊錶
迴圈鍊錶是另一種形式的鏈式存貯結構。它的特點是表中最後乙個結點的指標域指向頭結點,整個鍊錶形成乙個環。分類 1 單迴圈鍊錶 在單鏈表中,將終端結點的指標域null改為指向表頭結點或開始結點即可。2 多重鏈的迴圈鍊錶 將表中結點鏈在多個環上。空鏈判斷 判斷空鍊錶的條件是 head head next ...