基础数据结构6:单链表的逆置等等一些问题的处理

//怕段单链表是否存在环,如果存在,则返回打环的第一个节点
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值