單鏈表面試題總結(一)

2021-08-22 16:40:32 字數 1690 閱讀 1961

首先是鍊錶的結構

struct listnode

int mval;

listnode * pnext;

};

初始化

void initlist(listnode *phead)

1.單鏈表的頭插

bool insert_head(listnode* phead,int x)

.2.單鏈表的尾插

bool insert_tail(listnode* phead,int x)

3.單鏈表的查詢

listnode* search(listnode *phead,int x)

}return

null;

}

4.查詢待刪除節點的前驅

listnode* searchprev(listnode *phead,listnode* bedelete)

}return

null;

}

void deletenode(listnode *phead,listnode* bedelete)

(2) o(1)的時間複雜度刪除

把待刪除節點的下乙個節點的內容複製到待刪除節點,然後把下乙個節點刪除,相當於把當前要刪除的節點刪除了

這個方法雖然時間複雜度小,但是要考慮的情況很多(3種):刪除的是不是尾節點,這個尾節點會不會是頭節點

void deletelistnode(listnode * phead,listnode *bedelete)

else

if(phead == bedelete)//2.鍊錶只有乙個節點,既是頭節點,也是尾節點

else

//鍊錶中有多個節點,要刪除的是尾節點

p->pnext = bedelete->pnext;//bedelete->pnext其實就是null

delete bedelete;

bedelete =

null;

}}

6.單鏈表的正序列印

void show(listnode *phead)

cout<}

7.(1)從尾到頭列印鍊錶,用棧

void printlistreverse(listnode *phead)//這個沒有返回,直接列印

while(!st.empty())//出棧

cout

<(2)從尾到頭列印鍊錶,用遞迴,缺點是容易導致棧溢位

vector

printlistreverse_digui(listnode *phead)//將_vec返回,在呼叫它的函式中進行列印

_vec.push_back(phead->mval);

return _vec;

}

8.鍊錶的逆置

listnode* reverselist(listnode* phead)//逆置之後沒有改變頭節點,依然可以返回,不返回也可以

return phead;

}

單鏈表 (面試題)

關於單鏈表的基本操作,之前已經總結過了,那些掌握之後算是了解了單鏈表是什麼?不過現在面試的題中,肯定不會只讓你回答單鏈表的基礎操作,總是會改變一些東西,或是擴充套件一下。下面就是一些關於單鏈表的擴充套件內容 include include include pragma warning disable...

單鏈表面試題

1.倒序列印鍊錶 void reverseprint slistnode pfirst 有兩種方法 1.遞迴操作 2.非遞迴操作 2 非遞迴 slistnode pend slistnode pcur pend null while pfirst pend pend pcur printf d pe...

單鏈表(面試題)

鍊錶反轉思路 1.單鏈表中有效節點的個數 2.查詢單鏈表中弟第k個節點 3.單鏈表的反轉 實現 如下 public class testlink 1單鏈表中有效節點的個數 遍歷得出個數 public static intcount heronode head int count 0 while tr...