1、刪除單鏈表的非尾節點
解題思路:按照一般的思路單鏈表刪除節點是必須知道其前驅節點才能刪除,而在本題中不知道前驅節點,所以轉換思路,先將需要刪除的節點跟其後繼節點的數據域交換,然後再刪除既可。
void EraseNotTail(pLinkNode pos)
{
assert(pos);
pLinkNode del = NULL;//刪除的節點
del = pos->next;
pos->data = pos->next->data;
pos->next = pos->next->next;
free(del);
del = NULL;
}
2、冒泡排序單鏈表
void BubbleSort(pList * pHead)
{
pLinkNode cur = *pHead;
pLinkNode end = NULL;
int change = 1;
assert(pHead);
if (*pHead == NULL)
{
return;
}
else if (cur->next == NULL)
{
return;
}
while ((cur != end)&&(change))//控制排序幾輪
{
change = 0;
while ((cur)&&(cur->next != end))//排序
{
change = 1;
if (cur->data > cur->next->data)
{
DataType tmp = cur->data;
cur->data = cur->next->data;
cur->next->data = tmp;
}
cur = cur->next;
}
end = cur;
cur = *pHead;//使得單鏈表從頭開始
}
}
3、在當前節點前插入一個數據x
思路解析:按照一般的思路其應該需要找到節點的前驅節點,才能插入,但是可以換一個思路,可以先把節點插入到其後方,然後再將兩個節點的數據域進行交換即可很好的解決該問題。
void InsertFrontNode(pLinkNode pos, DataType x)
{
pLinkNode newNode = BuyNode(x);
assert(pos);
newNode->next = pos->next;
pos->next = newNode;
DataType tmp = pos->data;
pos->data = pos->next->data;
pos->next->data = tmp;
}
本文出自 “LeetCode小白的逆襲之路” 博客,請務必保留此出處http://10788311.blog.51cto.com/10778311/1746890