目录:
1.从尾到头打印单链表
//非递归
void PrintR(SListNode *pFirst)
{
SListNode *pNode = pFirst;
SListNode *end = NULL;
while (end != pFirst)
{
while (pNode->pNext != end)
{
pNode = pNode->pNext;
}
end = pNode;
printf("%d ", pNode->data);
pNode = pFirst;
}
}
//递归
void show(SListNode*p)
{
if (p->pNext)
{
show(p->pNext);
}
printf("-> %d", p->data);
}
2.逆置单链表
SListNode *ReverseSList(SListNode *pFirst)
{
SListNode *pNewFirst = NULL;
DataType data;
while (pFirst != NULL) {
data = pFirst->data;
PopFront(&pFirst);
PushFront(&pNewFirst, data);
}
return pNewFirst;
}
3.删除一个无头单链表的非尾节点(不能遍历链表)
void Erase(SListNode *pPos)
{
assert(pPos != NULL);
SListNode *pNext = pPos->pNext;
pPos->pNext = pNext->pNext;
pPos->data = pNext->data;
free(pNext);
}
4.在无头单链表的一个节点前插入一个节点(不能遍历链表)
void Insert(SListNode *pPos, DataType data)
{
SListNode *pNewNode = (SListNode *)malloc(sizeof(SListNode));
assert(pNewNode != NULL);
pNewNode->data = pPos->data;
pNewNode->pNext = pPos->pNext;
pPos->data = data;
pPos->pNext = pNewNode;
}
5.合并两个有序链表, 合并后依然有序
SListNode * MergeOrderedList(SListNode *p1First, SListNode *p2First)
{
SListNode *p1 = p1First;
SListNode *p2 = p2First;
SListNode *pNewFirst = NULL;
while (p1 != NULL && p2 != NULL) {
if (p1->data < p2->data) {
PushBack(&pNewFirst, p1->data);
p1 = p1->pNext;
}
else {
PushBack(&pNewFirst, p2->data);
p2 = p2->pNext;
}
}
// 有一个链表为空了
SListNode *pNotEmpty = p1;
if (p1 == NULL) {
pNotEmpty = p2;
}
// 把不空的链表剩余结点插入新链表
while (pNotEmpty) {
PushBack(&pNewFirst, pNotEmpty->data);
pNotEmpty = pNotEmpty->pNext;
}
return pNewFirst;
}
6.查找单链表的中间节点,要求只能遍历一次链表
SListNode * FindMiddle(SListNode *pFirst)
{
assert(pFirst != NULL);
SListNode *pFast = pFirst;
SListNode *pSlow = pFirst;
while (1) {
pFast = pFast->pNext;
if (pFast == NULL) {
break;
}
pFast = pFast->pNext;
if (pFast == NULL) {
break;
}
pSlow = pSlow->pNext;
}
return pSlow;
}
7.约瑟夫环
SListNode * JocephCircle(SListNode *pFirst, int k)
{
//构造循环链表
SListNode *pNode = pFirst;
SListNode *pPrev = NULL;
int i;
while (pNode->pNext) {
pNode = pNode->pNext;
}
pNode->pNext = pFirst;
pNode = pFirst;
while (pNode->pNext != pNode) {
for (i = 0; i < k - 1; i++) {
pPrev = pNode;
pNode = pNode->pNext;
}
//删除第 k 个结点
pPrev->pNext = pNode->pNext;
free(pNode);
pNode = pPrev->pNext;
}
return pNode;
}