一、有關建立鍊錶
①設資料集合a,其值均為正整數,無序且含有重複值。建立乙個單向鍊錶,每個結點資料域的值為資料集合的值且不重複
例a=建立後的鍊錶如下:
**如下:
#include#define n 8
typedef struct nodeelemsn;
elemsn *createlink(int a)
}}int main(void)
; elemsn *head;
head = createlinnk(a);
//輸出
printlink(head);
}
思路:
遍歷集合a,在鍊錶中找看是否存在存在集合a中的元素,如果鍊錶中p->date=-a[i],表示存在這個元素,若p為null表示不存在這個元素,所以以p是否為null為條件,判斷是否存在這個元素。if§為真,即p不為null,表示存在該元素,只需要執行計數+1,即count++;if§為假時,表示在鍊錶中沒有找到該元素,則需要建立表並且計數為1。
②設資料集合a的值無序且不重複,建立乙個公升序鍊錶
例a=建立後的鍊錶
核心**
h= null;
for(int i = 0;idate= a[i];
np ->next = null;
for(p = h;p && p->datenext);
if(p == h)else
}
改進
當p == h 時,np->next=h相當於np->next = p;
所以if語句和else語句中都有np->next = p,即可以把這句提出去
改進**如下
h= null;
for(int i = 0;idate= a[i];
np ->next = null;
for(p = h;p && p->datenext);
np ->next = p;
if(p == h)else
}
思路:
先遍歷集合a,當集合a遍歷結束時公升序鍊錶也構建完成。相當於對鍊錶進行插入操作。插入分三種情況:(1)頭插(2)中間插(3)尾插,中間插和尾插可以歸併在一起看成尾插,所以分為兩種情況:當p->datenext=p;q->next=np;
(此題需要兩指標聯動,因為進行插入操作時需要直到插入的前乙個結點)
二、有關跑鍊錶
①設head指向乙個非空單向鍊錶,返回鍊錶中間結點位址。若有偶數個結點,返回前半段的尾結點。
如圖,結點為偶數時:
結點為奇數時
方法一:
int i ,cnt = 0;
for(p =h;p;cnt++,p = p->next);
for(p=h,i=0;inext;
} return (cnt%2)p:q;
思路:
此方法用兩指標聯動;
先遍歷鍊錶,得到鍊錶的結點數cnt,用鍊錶結點數%2,若為0,則是偶數個結點,返回q,否則返回p。
方法二:
int i,cnt = 0;
for(p = h;p;cnt++,p = p->next);
for(p=h,i = 0;inext,++i);
return p;
思路:不借助指標q,只用指標p實現中間結點的返回。如果結點為偶數即為6時,6/2=3,返回的是結點p往後移動兩次後的結點,即指標p之前的結點指標q;若結點為奇數時5/2=2,回的是結點p往後移動兩次後的結點即返回指標p;若偶數結點時用(6-1)/2=2,即直接返回指標p指向的結點,奇數結點用(5-1)/2=2,即返回指標p指向的結點,所以返回的結點得到了統一,不論結點是偶數還是奇數的情況下都返回指標p指向的結點。
上述的方法一與方法二都需要把鍊錶遍歷一次半,效率不高。
方法三:長短指標
//當為偶數個結點時
for(lp = sp =h; lp; lp=lp->next->next,sq=sp,sp=sp->next);
//當為奇數個結點時
for(lp =sp =h;lp->next; lp=lp->next->next,sq=sp,sp=sp->next);
if(!lp)//偶數個結點時
sq = sp;
return sp;
偶數個結點時
長短指標方法,鍊錶只需遍歷一遍,因為長短指標的操作是同時進行的。
長指標遍歷完整個鍊錶時操作結束。當長指標指向為null時,說明是偶數個結點,當長指標的下乙個結點為空時,說明是奇數個結點。
此方法用到兩指標聯動。為偶數個結點需要返回sp指標指向的前乙個結點即sq,奇數個結點時需要返回sp指標指向的結點。
方法四:
for(lp = sp = h;lp && lp->next;lp = lp->next->next,sq = sp,sp = sp->next);
if(!lp)
sp = sq;
return sp;
方法四在方法三的基礎上進行改動,減少了時間複雜度
【若使sq = null時,適用於空鍊錶】
②設head指向乙個非空單向鍊錶。判斷該鍊錶是否帶環,若帶環返回1.否則返回0
例如下圖就是帶環的情況
長短指標的方法。若存在環,則長指標和短指標肯定會重合,如上圖所示。
思路:先假設不帶環,以不帶環為條件進行迴圈
上面的**只適用於2個或2個以上的結點,若為1個結點時,使用上述**無論怎樣都返回1,都帶有環,所以對上述**進行改進
改進:立flag
lp = sp = h;
flag = 0;
while(lp && lp->next && !flag)
}return flag;
鍊錶 反轉單向鍊錶
思路 從第二個元素開始。1 刪除當前元素。2 把當前元素放到頭結點位置。其中需要宣告3個變數 headnode 頭結點 prenode 前乙個結點 currentnode 當前結點 具體步驟如圖所示 實現 反轉單鏈表方法實現類 created by liujinjin on 17 1 19.publ...
鍊錶1 單向鍊錶
鍊錶中最簡單的一種是單向鍊錶,它包含兩個域,乙個資料域和乙個指標域,指標域指向鍊錶中的下乙個節點,最後乙個節點的指標域指向乙個空值 鍊錶最基本的結構是在每個節點儲存資料和到下乙個節點的位址,在最後乙個節點儲存乙個特殊的結束標記,另外在乙個固定的位置儲存指向第乙個節點的指標,有的時候也會同時儲存指向最...
鍊錶之反轉部分單向鍊錶
package com.chenyu.zuo.linkedlist import com.chenyu.zuo.linkedlist.removebyratio.node 題目 給定乙個單向鍊錶的頭結點head,以及兩個整數from和to 在單項鍊表上把第from個節點和第to個節點這一部分進行反轉...