單向鍊錶之建立特殊鍊錶及跑鍊錶習題

2021-09-08 01:27:20 字數 3776 閱讀 9315

一、有關建立鍊錶

①設資料集合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個節點這一部分進行反轉...