1.逆序打印单链表
void LinkListReversePrint(LinkNode* head);
{
if (head == NULL)
{
return ;
}
LinkNode *cur = head;
while(cur)
{
LinkNode *new_head = NULL;
LinkNode *tmp = cur;
cur = cur->next;
tmp->next = new_head;
new_head->next = tmp;
}
LinkNode *new_cur = new_head;
while (new_cur)
{
printf("[%c]->", new_cur->data);
new_cur = new_cur->next;
}
printf("NULL\n");
}
2.不允许遍历链表, 在 pos之前插入
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value)
{
if (*head == NULL)
{
return ;
}
if (pos == NULL)
{
return ;
}
LinkNode *new_node = CreatNewNode(pos->data);
LinkNode *cur = pos->next;
pos—>next = new_node;
new_node->next = cur;
pos->data = value;
}
3.单链表逆置
void LinkListReverse(LinkNode** head);
{
if (head == NULL)
{
return ;
}
if (*head == NULL)
{
return ;
}
LinkNode *new_head = NULL;
LinkNode *cur = *head;
while(cur)
{
LinkNode *tmp = cur;
cur = cur->next;
tmp->next = new_head;
new_head->next = tmp;
}
}
4.单链表的冒泡排序
void LinkListBubbleSort(LinkNode* head)
{
if (head == NULL)
{
return ;
}
LinkNode* prev = NULL;
LinkNode* next = NULL;
//tail是冒泡排序时的尾标记
LinkNode* tail = NULL;
while (tail != head) {
//优化标记
int exchange = 0;
//将数据向后冒
prev = head;
next = head->next;
while (next != tail) {
//交换
if (prev->data > next->data) {
LinkType tmp = prev->data;
prev->data = next->data;
next->data = tmp;
exchange = 1;
}
//指针分别向后移动一个结点
prev = next;
next = next->next;
}
if (exchange == 0) {
return;
}
//更新尾标记
tail = prev;
}
5.将两个有序链表, 合并成一个有序链表
LinkNode* LinkListMerge(LinkNode* head1, LinkNode* head2);
{
if (head1 == NULL && head2 == NULL)
{
return ;
}
if (head1 == NULL)
{
return head2;
}
if (head2 == NULL)
{
return head1;
}
LinkNode *head = head1->data < head2->data;
LinkNode *cur1 = head1;
LinkNode *cur2 = head2;
while (cur1 && cur2)
{
}
}
6.找到链表中间节点
LinkNode* FindMidNode(LinkNode* head);
{
if (head == NULL)
{
return ;
}
LinkNode *slow = head;
LinkNode *fast = head;
while (fast)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
7.找到倒数第 K 个节点.
LinkNode* FindLastKNode(LinkNode* head, size_t k) {
if (head == NULL) {
return;
}
LinkNode* fast = head;
LinkNode* slow = head;
while (k) {
fast = fast->next;
k--;
}
while (fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
8.删除倒数第K个节点
void EraseLastKNode(LinkNode** head, size_t K);
{
if (head == NULL) {
return;
}
LinkNode* fast = head;
LinkNode* slow = head;
while (k) {
fast = fast->next;
k--;
}
while (fast) {
slow = slow->next;
fast = fast->next;
}
slow->data = slow->next->data;
LinkNode* delete = slow->next;
slow->next = delete->next;
DestoryNode(&delete);
}
9.判定单链表是否带环. 如果带环返回1
LinkNode* HasCycle(LinkNode* head)
{
if (head == NULL) {
return -1;
}
LinkNode* slow = head;
LinkNode* fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (fast == slow)
{
return 1;
}
}
return -1;
}
10.如果链表带环, 求出环的长度
size_t GetCycleLen(LinkNode* head)
{
if (head == NULL) {
return -1;
}
LinkNode* slow = head;
LinkNode* fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (fast == slow)
{
size_t len;
do{
len++;
}while (slow != fast);
return len;
}
}
return -1;
}
11.如果链表带环, 求出环的入口
LinkNode* GetCycleEntry(LinkNode* head)
{
if (head == NULL) {
return -1;
}
LinkNode* slow = head;
LinkNode* fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (fast == slow)
{
MetNode = fast;//保存相遇点
break;
}
}
LinkNode* cur = head;
while (1) {
cur = cur->next;
MetNode = MetNode->next;
if (cur == MetNode) {
return cur;
}
}
}