//單鏈表的儲存結構(還有沒頭結點的)(但由於用的不多所以這裡不說) (鍊錶適合畫圖理解)
struct lnode//對於某些神奇的編譯器應當加上struct(保證編譯正確) head是首節點不是頭結點
lnode;
typedef lnode* linklist;
//寫函式題目的時候注意返回值和遍歷的時候注意首節點還是頭結點(是否有資料)(如果是少了乙個資料或多了個位址考慮一下這個)
//單鏈表的構造(頭插法)(逆序法)
#include
#include
void
create
(linklist &l,
int n)
//為使l能夠在函式中改變
}//單鏈表的構造(尾插法)
#include
#include
void
create
(linklist &l,
int n)
p1->next=
null
;//為什麼不能是p2,因為空鍊錶不行
}//單鏈表的查詢遍歷
bool
chazhao
(linklist l,
int i,
int&e)
//這裡的i表示第幾個元素
//單鏈表的插入
bool
charu
(linklist &l,
int i,
int example)
//單鏈表的刪除
bool
shanchu
(linklist &l,
int i)
/*
6-1 奇數值結點鍊錶 (20分)
本題要求實現兩個函式,分別將讀入的資料儲存為單鏈表、將鍊錶中奇數值的結點重新組成乙個新的鍊錶。鍊錶結點定義如下:
struct listnode ;
函式介面定義:
struct listnode *readlist();
struct listnode *getodd( struct listnode **l );
函式readlist從標準輸入讀入一系列正整數,按照讀入順序建立單鏈表。當讀到?1時表示輸入結束,函式應返回指向單鏈表頭結點的指標。
函式getodd將單鏈表l中奇數值的結點分離出來,重新組成乙個新的鍊錶。返回指向新煉表頭結點的指標,同時將l中儲存的位址改為刪除了奇數值結點後的鍊錶的頭結點位址(所以要傳入l的指標)。
裁判測試程式樣例:
#include #include struct listnode ;
struct listnode *readlist();
struct listnode *getodd( struct listnode **l );
void printlist( struct listnode *l )
printf("\n");
}int main()
/* 你的**將被嵌在這裡 */
輸入樣例:12
2345
67-1
輸出樣例:13
5722
46 作者: c課程組
單位: 浙江大學
時間限制:
400 ms
記憶體限制:
64 mb*/
#include
#include
struct listnode
;struct listnode *
readlist()
;struct listnode *
getodd
(struct listnode *
*l )
;void
printlist
(struct listnode *l )
printf
("\n");
}int
main()
/* 你的**將被嵌在這裡 */
struct listnode *
readlist()
} p1-
>next=
null
;//只能是p1(空鍊錶)
return lt-
>next;
}struct listnode *
getodd
(struct listnode *
*l )
//指標的指標,要得指標首先加*(我都暈了其實,,,,)
p=p-
>next;
} p1-
>next=
null
;//只能是p1(空鍊錶)
p=*l;while
(p->next)
p=*l;if
(p->data%2==
1)*l=p-
>next;
return l2-
>next;
}
/*
6-4 兩個有序鍊錶序列的合併 (15分)
本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。
函式介面定義:
list merge( list l1, list l2 );
其中list結構定義如下:
typedef struct node *ptrtonode;
struct node
;typedef ptrtonode list;
/* 定義單鏈表型別 */
l1和l2是給定的帶頭結點的單鏈表,其結點儲存的資料是遞增有序的;函式merge要將l1和l2合併為乙個非遞減的整數序列。應直接使用原序列中的結點,返回歸併後的帶頭結點的煉表頭指標。
裁判測試程式樣例:
#include
#include
typedef
int elementtype;
typedef
struct node *ptrtonode;
struct node
;typedef ptrtonode list;
list read()
;/* 細節在此不表 */
void
print
( list l )
;/* 細節在此不表;空煉表將輸出null */
list merge
( list l1, list l2 )
;int
main()
/* 你的**將被嵌在這裡 */
輸入樣例:31
3552
46810
輸出樣例:12
3456
810null
null
作者: ds課程組
單位: 浙江大學
時間限制:
400 ms
記憶體限制:
64 mb*/
list merge
( list l1, list l2 )
else}if
(pl1==
null
) p1-
>next=pl2;
if(pl2==
null
) p1-
>next=pl1;
l1->next=
null
; l2-
>next=
null
;return l;
}
雙指標(快慢指標)判斷鍊錶是否有環
單鏈表的特點是每個節點知道下乙個節點 如果用乙個指標來判斷是否有環,當沒有環時,指標一直會指到鍊錶的為即指到null,但是當有環時,指標將陷入死迴圈,因為環形鍊錶中沒有null指標作為尾部節點 while head null head head.next return false 找到一種經典解法 ...
快慢指標判斷鍊錶是否有環
關於鍊錶是否有環,其實是一系列問題,主要包括以下幾個 使用快慢指標fast和slow,fast每次走兩步,slow每次走一步,如果有環,肯定會相遇,如果沒有,則指標fast遇到null退出。追及相遇問題。在環上相遇後,記錄第一次相遇點為pos,之後指標slow繼續每次走1步,fast每次走2步。在下...
使用快慢指標判斷鍊錶是否有環
今天做到leetcode 141 linked list cycle,判斷鍊錶是否存在環,因為看到題目中的val都是整數,所以我是將每個node用1.1作為值去mark了,如果head.next的val是1.1,就說明我指向的下個結點已經走過了,這就是乙個環,如果走到最後head走到none了還沒返...