数据结构中单链表的应用
一、

int findDownNode(Node* L, int k)
{
Node* fast = L->next;
Node* slow = L->next;
for (int i = 0;i < k;i++)
{
fast = fast->next;
}
while (fast != NULL)
{
fast = fast->next;
slow = slow->next;
}
printf("倒数第%d个节点内的数据为:%d", k, slow->data);
return 1;
}
int main()
{
Node* L = initList();
insertHead(L, 11);
insertHead(L, 12);
insertHead(L, 13);
insertHead(L, 14);
insertHead(L, 15);
findDownNode(L, 3);
return 0;
}

二、

//找到相同后缀的首节点
Node* findsameNode(Node* La, Node* Lb)
{
Node* fast = NULL;
Node* slow = NULL;
int m = 0;
int n = 0;
int d = 0;
if (La == NULL || Lb == NULL)
{
return NULL;
}
Node* p = La;
while (p != NULL)
{
p = p->next;
m++;
}
p = Lb;
while (p != NULL)
{
p = p->next;
n++;
}
if (m > n)
{
d = m - n;
fast = La->next;
slow = Lb->next;
}
else
{
d = n - m;
fast = Lb->next;
slow = La->next;
}
for (int i = 0;i < d;i++)
{
fast = fast->next;
}
while (fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
三、

//删除绝对值相同的数据
void deletesameNode(Node* L, int n)
{
Node* p = L;
int a;//用来记录数组下标
int* q = (int*)malloc(sizeof(int) * (n + 1));//创建数组
for (int i = 0;i < n + 1;i++)
{
*(q + i) = 0;
}
while (p->next != NULL)
{
a = abs(p->next->data);
if (*(q + a) == 0)
{
*(q + a) = 1;
p = p->next;
}
else
{
Node* temp = p->next;
p->next = temp->next;
free(temp);
}
}
free(q);
}
int main()
{
Node* L = initList();
insertHead(L, 3);
insertHead(L, 5);
insertHead(L, -1);
insertHead(L, 2);
insertHead(L, 1);
insertHead(L, 7);
insertHead(L, -3);
insertHead(L, 5);
listNode(L);
deletesameNode(L, 8);
listNode(L);
return 0;
}

反转链表的插入
//反转链表插入
Node* reverseList(Node* Head)
{
Node* p = Head;
Node* first = NULL;
Node* second = p->next;
Node* third = NULL;
while (second != NULL)
{
third = second->next;
second->next = first;
first = second;
second = third;
}
Head->next = first;
return Head;
}
int main()
{
Node* L = initList();
insertHead(L, 3);
insertHead(L, 5);
insertHead(L, -1);
insertHead(L, 2);
insertHead(L, 1);
insertHead(L, 7);
insertHead(L, -3);
insertHead(L, 5);
listNode(L);
L = reverseList(L);
listNode(L);
return 0;
}

删除链表中间节点
//删除链表的中间节点
int deletemiddleNode(Node* L)
{
Node* fast = L->next;
Node* slow = L;
while (fast != NULL && fast->next != NULL)
//括号内的顺序内不能变换
{
fast = fast->next->next;
slow = slow->next;
}
Node* temp = slow->next;;
slow->next = temp->next;
free(temp);
return 1;
}
int main()
{
Node* L = initList();
insertHead(L, 3);
insertHead(L, 5);
insertHead(L, 1);
insertHead(L, 2);
insertHead(L, 1);
insertHead(L, 7);
insertHead(L, 3);
insertHead(L, 5);
listNode(L);
deletemiddleNode(L);
listNode(L);
return 0;
}

五、

//断开反转插入
void reinsert(Node* L)
{
Node* fast = L->next;
Node* slow = L;
while (fast != NULL && fast->next != NULL)
//括号内的顺序内不能变换
{
fast = fast->next->next;
slow = slow->next;
}
Node* p = slow->next;
slow->next = NULL;
Node* first = NULL;
Node* second = p;
Node* third = NULL;
while (second != NULL)
{
third = second->next;
second->next = first;
first = second;
second = third;
}
Node* p1;
Node* p2;
Node* q1;
Node* q2;
p1 = L->next;
q1 = first;
while (p1 != NULL && q1 != NULL)
{
p2 = p1->next;
q2 = q1->next;
p1->next = q1;
q1->next = p2;
p1 = p2;
q1 = q2;
}
}
int main()
{
Node* L = initList();
insertHead(L, 3);
insertHead(L, 5);
insertHead(L, 1);
insertHead(L, 2);
insertHead(L, 1);
insertHead(L, 7);
insertHead(L, 3);
insertHead(L, 5);
listNode(L);
reinsert(L);
listNode(L);
return 0;
}

单链表应用详解
1372

被折叠的 条评论
为什么被折叠?



