資料結構 單鏈表

2021-07-11 17:37:23 字數 3667 閱讀 9521

最近複習資料結構,加強下自己的基礎。在複習中遇到的問題在這裡做下筆記。

單鏈表是一種鏈式訪問的資料結構,用一組位址任意的儲存單元存放線性表中的資料元素。

單鏈表的定義:

typedef

struct lnodelnode; // 定義單鏈表結點型別

單鏈表的構造方法(尾插法和頭插法)

(1)尾插法

void createlistr(lnode *&c, int a, int n)

r -> next = null; //所有元素都裝入了鍊錶 c 中,將 c 的終端結點的指標域置為null

(2)頭插法

鍊錶刪除( 刪除 p->next )

鍊錶的插法(頭插法和尾插法)和刪除是所有鍊錶知識的基礎知識,很多操作都是由著三個基本操作組成。

下面介紹乙個鍊錶的綜合題目(leetcode上面的)

給定兩個非負整數(個位整數)的單鏈表,將兩個單鏈表中對應元素相加的到的值儲存到乙個單鏈表中

輸入: [2, 4, 3]

[5, 6, 4]

輸出: [7, 0 ,8]

題目分析:(根據題目描述和輸入輸出例項)每個單鏈表中元素的值相加,如果小於10,則得到的值即為所求的值,如果相加的值大於10,那麼所要求的值為個位上的數,同時十位上的1要加到下次運算中。

思想分析:可以建立乙個單鏈表,讓其長度為輸入鍊錶中最大的長度。因為單鏈表沒有提供length的屬性,那麼只有通過變數才能得到最大的長度,這樣會加大執行的負擔,因此在遍歷單鏈表的時候,判斷單鏈表是否為空,如果乙個單鏈表為空,另乙個還沒有為空,那麼為空的那個單鏈表往後的值可以認為是0,這樣就不會影響最終的計算,一次遍歷就可以達到最大的長度。需要注意的是,如果遍歷完後,最後一次的得到的值大於10,那麼需要在最後再新增乙個結點,來儲存得到的十位數。

**實現(c++)

#include 

using

namespace

std;

// definition for singly-linked list.

struct listnode

};//使用模板定義乙個函式getarraylen,該函式將返回陣列array的長度

template

int getarraylen(t& array)

class solution

r->next = null;

return

list->next;

}listnode* addtwonumbers(listnode* l1, listnode* l2) else

//鍊錶尾插法

r -> next = s;

r = r -> next;

if (p != null) p = p -> next; //p不為空的話,向後移動乙個位置

if (q != null) q = q -> next;

}if (flag == 1 )

r -> next = null; //所有元素都裝入了鍊錶 l3 中,將 l3 的終端結點的指標域置為null

return l3->next; //返回去除頭結點的 l3 鍊錶

}};int main(int argc, const

char * argv) ;

int b = ;

// int a = ;

// int b = ;

//// int a = ;

// int b = ;

//// int a = ;

// int b = ;

//計算陣列的長度

int alength = getarraylen(a);

int blength = getarraylen(b);

solution s;

//尾插法得到無頭結點的單鏈表

listnode* l1 = s.createliste(a, alength);

listnode* l2 = s.createliste(b, blength);

//計算兩個單鏈表的和

listnode* l3 = s.addtwonumbers(l1, l2);

listnode* r = l3;

while (r!=null)

cout

0;}

例題2:判斷乙個鍊錶是否有環

思路:定義兩個指標,一快一慢,當兩個指標相遇,則證明有環,否則沒有環。

**如下:

/**

* definition for singly-linked list.

* struct listnode

* };

*///找到第一次相遇的節點(如果有環,返回相遇的節點,沒有環,返回null)

bool cyclelist(listnode *head)

return

false;//無環 返回false

}

例題3:如果乙個鍊錶有環,找出環的入口

分析:同樣定義2個指標,然後將其中乙個指標向後移動環的長度n,然後兩個指標以相同的速度向前移動。當第二個指標指向環的入口結點時,後面的那個指標已經圍繞環走了一圈,回到了入口結點,兩個指標相遇。

求環的長度,可以先找出環中任意的乙個結點,然後從這個結點出發,一邊向後移動,一邊計數,再次返回這個結點的時候,就可以得到環的長度了。

**如下:

/**

* definition for singly-linked list.

* struct listnode

* };

*/ //找到第一次相遇的節點(如果有環,返回相遇的節點,沒有環,返回null)

listnode *meetingnode(listnode *head)

return null;//無環 返回null

}listnode *detectcycle(listnode *head)

//建立2個指標,乙個指向頭節點,乙個向後移動環的長度,兩個指標相遇的地方就是環的入口

pheadnode = head;

listnode *plastnode = head;

while(count)

while(pheadnode != plastnode)

return plastnode;

}

資料結構單鏈表

初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...

資料結構 單鏈表

今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...

資料結構 單鏈表

實現乙個單鏈表 1 查詢 查詢第index個節點 查詢指定的元素 2 插入 將指定的元素插入到第index個節點上 3 刪除 將第index個節點刪除 規律 刪除和新增元素前務必儲存兩個元素的位址引用資訊 public class mylinkedlist 記錄鍊錶結構的頭結點位址引用 privat...