slist.h
slist.cvoid printlistfromtail2head(pnode phead);//從尾到頭列印單鏈表
void erasenottailnode(pnode pos);//刪除非尾結點
void insertfront(pnode pos,datatype data);//無頭單鏈表插入結點
void josephcircle(pnode *pphead,size_t m);//約瑟夫環
void reverselist(pnode *pphead);//鍊錶逆置
pnode reverselist_p(pnode phead);//鍊錶逆置(頭插法)
void bubblesort(pnode phead);//氣泡排序
pnode findmidllenode(pnode phead);//查詢單鏈表的中間結點,要求只能遍歷一次
pnode findlastknode(pnode phead, size_t k);// 查詢單鏈表的倒數第k個結點
int deletelastknode(pnode* pphead,size_t k);//刪除倒數第k個結點
pnode mergeliist(pnode phead1,pnode phead2);//合併兩個有序的單鏈表
pnode hascircle(pnode phead);//判斷單鏈表是否帶環
size_t getcirclelen(pnode phead);//求環的長度
test.cvoid printlistfromtail2head(pnode phead)//列印結點
//採用函式遞迴 1-->2-->3--4-->null 遞迴了5次
//時間複雜度:o(n+1) //空間複雜度:o(n+1)
//迴圈實現
//...}
void insertfront(pnode pos, datatype data)//無頭單鏈表插入結點
void josephcircle(pnode *pphead, size_t m)//約瑟夫環
*pphead = pcur;
}void reverselist(pnode *pphead)//鍊錶逆置 (以下兩種方法均不能處理帶環問題,如果要處理,可先將環拆開,然後按照正常方法進行逆置,最後將頭尾結點指向頭結點即可)
*pphead = ppre; //已經變成頭結點,更新頭結點
}pnode reverselist_p(pnode phead)//鍊錶逆置(帶環:將phead指向pnewhead)
return pnewhead;
}void bubblesort(pnode phead)//氣泡排序
pcur = pnext;
pnext = pcur->_pnext;
} if (!ischange)
return;
ptail = pcur; }}
pnode findmidllenode(pnode phead)//尋找中間結點
return pslow;
}pnode findlastknode(pnode phead,size_t k)//尋找倒數第k個結點 //時間複雜度:o(n)
//然後同時走
while (pfast->_pnext)
return pslow;
}int deletelastknode(pnode* pphead, size_t k)//刪除倒數第k個結點
while (pfast)
if (pslow == *pphead)
*pphead = pslow->_pnext;
else
ppreslow->_pnext = pslow->_pnext;
free(pslow);
return 1;
}pnode mergeliist(pnode phead1, pnode phead2)//合併兩個有序單鏈表
else
while (pl1 && pl2)
else
ptail = ptail->_pnext;
} if (pl1)
ptail->_pnext = pl1;
if (pl2)
ptail->_pnext = pl2;
return pnewnode;
}pnode hascircle(pnode phead)//判斷單鏈表是否帶環
return 0;
}size_t getcirclelen(pnode phead)//求環的長度(r)
return len;
}
void testslist5()
void testslist6()//測試約瑟夫環
void testslist7()//鍊錶逆置
void testslist8()//氣泡排序
void testslist9()//尋找倒數第k個結點
deletelastknode(&phead, 6);
slistprint(phead);
deletelastknode(&phead, 2);
slistprint(phead);
}//講解到2017.12.17 15:26
void testslist10()
單鏈表相關的面試題
pragma once include list.h 1.逆序列印單鏈表 template void list printtailtohead node phead 2.刪除無頭節點的單鏈表的非尾節點 template void list delnontailnode node pos 3.無頭單鏈...
單鏈表相關熱點面試題(一)
對於單鏈表相關的問題,往往是面試的熱點,在此我總結了一些單鏈表相關熱點面試題 一 比較順序表和煉表的優缺點,說說它們分別在什麼場景下使用?一 順序表的特點是邏輯上相鄰的資料元素,物理儲存位置也相鄰,並且,順序表的儲存空間需要預分配。它的優點是 1 方法簡單,各種高階語言中都有陣列,容易實現。2 不用...
單鏈表詳解以及單鏈表相關面試題總結
目錄 1.單鏈表的定義 2.獲取單鏈表的第i個元素 3.單鏈表的插入操作 4.單鏈表的刪除操作 5.單鏈表的整表刪除 6.判斷兩個單鏈表是否相交 7.如果兩個鍊錶相交,如何尋找相交的節點 8.判斷乙個單鏈表是否有環 9.如果乙個鍊錶有環,如何找到環的入口 10.找到單鏈表中的倒數第k個節點 11.兩...