#include "SList.h"
// 倒叙打印链表
void ReversePrint(Node *pFirst)
{
Node *last = NULL;
Node *cur = pFirst;
while (last != pFirst)
{
cur = pFirst;
while (cur->next != last)
{
cur = cur->next;
}
printf("%d--->", cur->data);
last = cur;
}
printf("NULL\n");
}
// 逆置链表
Node * ReverseList(Node *pFirst)
{
Node *result = NULL;
Node *cur = pFirst; // 一直指向原来链表的第一个结点
Node *node;
while (cur != NULL) {
// 从原链表头删
node = cur;
cur = cur->next;
// 头插到结果链表
node->next = result;
result = node;
}
// 逆置完,做个打印
SListPrint(result);
}
// 删除非尾无头链表
void RemoveNodeNotTail(Node *pos)
{
Node* cur = NULL;
if (pos)
{
cur = pos->next;
pos->data = cur->data;
pos->next = cur->next;
free(cur);
}
}
// 无头链表前插入
void InsertNoHead(Node *pos, int data)
{
Node* new = NewNode();
new->data = data;
new->next = pos->next;
pos->data = new->data;
pos->next = new;
}
/*
约瑟夫环
*/
Node * JocephCircle(Node *pFirst, int k)
{
// 构成环
Node *cur = pFirst;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = pFirst;
// 删除结点
cur = pFirst;
Node *prev = NULL;
while (cur->next != cur)
{
for (int i = 0; i < k - 1; i++)
{
prev = cur;
cur = cur->next;
}
prev->next = cur->next;
free(cur);
cur = prev->next;
}
printf("%d\n", cur->data);
}
// 冒泡排序
void BubbleSort(Node *pFirst)
{
Node *cur = NULL;
Node *tail = NULL;
assert(pFirst);
cur = pFirst;
while (cur != tail)
{
while (cur->next != tail)
{
if (cur->data > cur->next->data)
{
DataType tmp = cur->data;
cur->data = cur->next->data;
cur->next->data = tmp;
}
cur = cur->next;
}
tail = cur;
cur = pFirst;
}
}
// 合并两个有序链表
Node * MergeOrderedList(Node *p1First, Node *p2First)
{
Node *result = NULL;
Node *tail = NULL; // result这个链表中的最后一个结点
Node *cur1 = p1First;
Node *cur2 = p2First;
Node *node;
while (cur1 != NULL && cur2 != NULL)
{
if (cur1->data <= cur2->data)
{
node = cur1; // node 是要放到结果链表中的结点
cur1 = cur1->next;
// 在结果链表尾插
if (tail == NULL)
{
result = node;
}
else
{
tail->next = node;
}
node->next = NULL;
// node 成为新的最后一个结点
tail = node;
}
else
{
node = cur2; // node 是要放到结果链表中的结点
cur2 = cur2->next;
// 在结果链表尾插
if (tail == NULL)
{
result = node;
}
else
{
tail->next = node;
}
node->next = NULL;
// node 成为新的最后一个结点
tail = node;
}
}
}
// 遍历一次,找到中间结点
Node * FindMid(Node *pFirst)
{
Node *fast = pFirst;
Node *slow = pFirst;
//快指针走两个
//慢指针走一个
while (1)
{
fast = fast->next;
if (fast == NULL)
{
break;
}
fast = fast->next;
if (fast == NULL)
{
break;
}
slow = slow->next;
}
printf("%d\n", slow->data);
}
//遍历一次,找到倒数第 k 个结点(k从1开始)
Node * FindK(Node *pFirst, int k)
{
Node *forward = pFirst;
Node *backward = pFirst;
// 倒一
// 1 2 3 4
// f
// fb
// fb
// fb
//
//倒二
//1 2 3 4
//f
// f
// b f
// b f
//
//
while (--k)
{ // k
forward = forward->next;
}
while (forward->next != NULL)
{
forward = forward->next;
backward = backward->next;
}
printf("%d\n", backward->data);
}
// 遍历一次,删除倒数第 k 个结点(k从1开始),不能用替换删除法
void RemoveK(Node *pFirst, int k)
{
Node *node = FindK(pFirst, k + 1);
if (node == NULL)
{
// 头删
}
else
{
Node *del = node->next;
node->next = node->next->next;
free(del);
}
}