//怕段单链表是否存在环,如果存在,则返回打环的第一个节点
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include"list(7_17).h"
PNode IsLoop(PNode plist)
{
assert(plist != NULL);
if (plist == NULL) return NULL;
Node* fast = plist;//快指针 2
Node* slow = plist;//慢指针 1
while (1)
{
if (fast == NULL || fast->next == NULL) return NULL;
fast = fast->next->next;
slow = slow->next;
if (fast == slow) break;
}
Node* p = plist;
Node* q = fast;
while (p != q)
{
p = p->next;
q = q->next;
}
return p;
}
//判断两个单链表是否相交?两个指针都指向尾节点是否是同一个节点
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include"list(7_17).h"
Node* Intersect(PNode plist1, PNode plist2)
{
assert(plist1 != NULL && plist2 != NULL);
int len1 = Get_length(plist1);
int len2 = Get_length(plist2);
Node* p = len1 > len2 ? plist1 : plist2;
Node* q = len1 > len2 ? plist2 : plist1;
for (int i = 0; i < abs(len1 - len2); i++)//abs求绝对值的函数
{
p = p->next;
}
while (p != NULL)
{
if (p = q)
{
return p;
}
p = p->next;
q = q->next;
}
return NULL;
}
PNode GetendK(PNode plist, int k)
{
assert(plist != NULL && k > 0 && k < Get_length(plist));
if (plist == NULL || k <= 0 || k > Get_length(plist)) return NULL;
Node* p = plist;
Node* q = plist;
for (int i = 0; i < k; i++)
{
p = p->next;
}
while (p != NULL)
{
p = p->next;
q = q->next;
}
return q;
}
//怎么删除节点,不允许找前驱(删除的节点不能是尾节点)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include"list(7_17).h"
bool DelPoint(PNode plist, PNode point)
{
assert(plist != NULL && point != NULL);
if (plist == NULL || point == NULL) return false;
if (point->next == NULL)
{
Del_pos(plist, Get_length(plist) - 1);
}
Node* p = point->next;
point->data = p->data;
point->next = p->next;
free(p);
p = NULL;
return true;
}
//单链表的逆置
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include"list(7_17).h"
//一直头插
void Reverse(PNode plist)
{
assert(plist != NULL);
Node* p = plist->next;
Node* q = NULL;
plist->next = NULL;
while (p != NULL)
{
q = p->next;
Insert_head(plist, p->data);
free(p);
p = q;
}
}
//不需要头节点参与,让其他节点指针逆置
void Reverse2(PNode plist)
{
assert(plist != NULL);
if (plist == NULL && plist->next == NULL && plist->next->next == NULL) return;
Node* p = plist->next;
Node* q = p->next;
Node* r;
plist->next = NULL;
while (q != NULL)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
plist->next = p;
}
int main()
{
Node head;
Init_list(&head);
for (int i = 0; i < 10; i++)
{
Insert_pos(&head, i, i + 1);
Show(&head);
}
return 0;
}
基础数据结构6:单链表的逆置等等一些问题的处理
于 2021-07-31 11:09:17 首次发布