線性表的應用4(鍊錶節點的移動)

2021-07-11 00:06:07 字數 1335 閱讀 7274

對單鏈表,編寫演算法實現以第乙個元素為基準,將小於該元素的節點全部放到前面,大於該節點的元素全部放到後面。時間複雜度要求為o(n),不能申請新空間。

演算法分析:

用兩根指標實現的移動,由於是單鏈表,兩根指標分別指向要移動的資料和要移動資料的前乙個,如果該元素比首元素大,則不用管,直接向下移動指標即可,如果比首元素節點要小,則把該節點從原處刪除,並把該節點插入到head後面,並把指標指回來即可。

**如下:

#include #include #include using namespace std;

typedef int elemtype;

typedef struct lnode

lnode,*linklist;

linklist create()

else return null;

}int getelem(linklist l,int i,elemtype &e)

if(!p||j>i)

e=p->data;

return 1;

}int listinsert(linklist &l,int i,elemtype e)

if(!p||j>i-1)

return 0;

s=(linklist)malloc(sizeof(lnode));

s->data=e;

s->next=p->next;

p->next=s;

return 1;

}int listdelete(linklist &l,int i,elemtype &e)

if(!(p->next)||j>i-1) return 0;

q=p->next;

p->next=q->next;

e=q->data;

free(q);

return 1;

}void jizhun(linklist &l)

else

}}void output(linklist l)

printf("\n");

}void freelink(linklist &l)

}int main()

{ int n,e,flag;

lnode *lhead;

while(scanf("%d",&n)!=eof)

{lhead=create();

if(lhead!=null)

{for(int i=1;i<=n;i++)

{scanf("%d",&e);

flag=listinsert(lhead,i,e);

if(flag==0)

{cout<<"insert fail"<

線性表 刪除鍊錶的節點

給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。返回刪除後的鍊錶的頭節點。注意 此題對比原題有改動 示例 1 輸入 head 4,5,1,9 val 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 1 9.示例 2 輸入...

迴圈鍊錶及線性表的應用

迴圈鍊錶的應用之約瑟夫環問題以及線性表總結之順序表與鍊錶的比較 1.1問題說明 問題描述 編號為1,2,n的n個人圍坐在一圓桌旁,每人持有乙個正整數的密碼。從第乙個人開始報數,報到乙個預先約定的正整數m時,停止報數,報m的人退席,下乙個人又重新從1開始報數,依此重複,直至所有的人都退席。編一程式輸出...

刪除線性表節點 線性表

submit 81 solved 66 submit status web board 已知長度為n的線性表a採用順序儲存結構,請寫一時間複雜度為0 n 空間複雜度為0 1 的演算法,該演算法刪除線性表中所有值為item的資料元素。o 1 表示演算法的輔助空間為常量 輸入 n 6 輸入資料 1 2 ...