c 實現 單鏈表的 反轉 拼接 判環等操作

2021-09-26 22:19:52 字數 3356 閱讀 8752

#include

#include

struct listnode

listnode* _pnext;

int _data;};

void

pushback

(listnode*

& phend,

int data)

listnode* pcur = phend;

while

(pcur->_pnext)

pcur->_pnext = new listnode

(data);}

//反轉乙個單鏈表

//方法一 用棧

//void reverselist(listnode*& phead)

// phead = s.top();

// s.pop();

// listnode* ppre = phead;

// while (!s.empty())

// pcur->_pnext = nullptr;

////}

//方法二 三個指標法

//void reverselist(listnode*& phead)

// phead = ppre;

//}//方法三 頭插法

void

reverselist

(listnode*

& phead)

phead = pnewhead;

}//返回中間結點 快指標速度是滿指標2倍

//快指標走到末尾 滿指標在中間

listnode*

findmiddlenode

(listnode* phead)

listnode* pslow = phead;

listnode* pfast = phead;

while

(pfast&&pfast->_pnext)

return pslow;

}//輸入乙個鍊錶輸出其倒數第k個結點

listnode*

findlastknode

(listnode* phead, size_t k)

listnode* pfast = phead;

//後置-- fast先走k步

while

(k--

) pfast = pfast->_pnext;

} listnode* pslow = phead;

while

(pfast)

return pslow;

}//刪除倒數第k個結點

void

deletelastknode

(listnode*

& phead,size_t k)

listnode* pfast = phead;

//後置-- fast先走k步

while

(k--

) pfast = pfast->_pnext;

} listnode* pslow = phead;

listnode* ppre = nullptr;

while

(pfast)

//刪除節點

if(pslow == phead)

else

delete pslow;

}//返回兩個有序鍊錶拼接後的

listnode*

mergelist

(listnode* phead1, listnode* phead2)

if(nullptr == phead2)

listnode newhead(0

);listnode* ptail =

&newhead;

listnode* pcur1 = phead1;

listnode* pcur2 = phead2;

while

(pcur1&&pcur2)

else

ptail = ptail->_pnext;}if

(nullptr == pcur1)

else

return newhead._pnext;

}size_t getlistsize

(listnode* phead)

return count;

}//輸入兩個鍊錶 求第乙個公共節點

listnode*

getcrossnode

(listnode* phead1, listnode* phead2)

//1.檢測兩個鍊錶是否相交

//檢測兩個鍊錶中最後乙個結點是否相同

listnode* ptail1 = phead1;

while

(ptail1)

listnode* ptail2 = phead2;

while

(ptail2)

if(ptail1 != ptail2)

//2.求交點

int size1 =

getlistsize

(phead1)

;int size2 =

getlistsize

(phead2)

;int gap = size1 - size2;

//較長鍊錶先往後移動兩個鍊錶差值

listnode* pcur1 = phead1;

listnode* pcur2 = phead2;

if(gap >0)

}else

}//兩個指標同時後移

while

(pcur1 != pcur2)

return pcur1;

}//判斷鍊錶中是否有環

//採用快慢指標 快指標每次走兩步 滿指標每次走一步

//如果鍊錶不帶環 快指標先走到末尾 若帶環兩個指標最終在環內相遇

listnode*

islistwithcircle

(listnode* phead)

}return nullptr;

}//求環的入口點

listnode*

getenternode

(listnode* phead)

listnode* ph = phead;

listnode* pm = pmeetnode;

while

(ph != pm)

return ph;

}void

print

(listnode*

& phead)

std:

:cout <<

"null"

<:endl;

}int

main()

C 單鏈表 判環

題源 牛客網 直通bat面試演算法精講課 題目 給定乙個單鏈表的頭結點head,判斷其是否有環,無環返回 1 有環返回 入環 的 第乙個 結點的 數值。要求 如果鍊錶長度是n個節點,請做到 時間複雜度為o n 額外空間複雜度為o 1 演算法思想的說明 1.單鏈表 每個結點只有 乙個next域 或者稱...

單鏈表判環的討論

聊天時聽到的這個問題,即有乙個單鏈表,可能有環 見圖 請判斷出是否存在這個環?貌似這是很常見的面試題 我居然沒印象 既然有個環,那就直接遍歷一遍環唄,用個陣列標記一下。時間複雜度和空間複雜度都是o n 這個思路的問題就是在於空間複雜度是o n 所以面試中,面試官總會再問,有沒有更好的解決方法。然後我...

C語言單鏈表實現約瑟夫環

1.約瑟夫環問題 編號為1,2 n的人按順時針方向圍坐一圈,每個人持有乙個密碼 正整數 開始任選乙個整數作為報數上限m,從第乙個人順時針自1開始順時針報數,報到m時停止報數。報到m的人出列,將他的密碼作為新的m值,從他順時針方向上的下乙個人開始重新從1報下去,如此下去,直到所有的人全部出列為止。例如...