最近複習資料結構,加強下自己的基礎。在複習中遇到的問題在這裡做下筆記。
單鏈表是一種鏈式訪問的資料結構,用一組位址任意的儲存單元存放線性表中的資料元素。
單鏈表的定義:
單鏈表的構造方法(尾插法和頭插法)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...