#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報下去,如此下去,直到所有的人全部出列為止。例如...