数据结构笔记之链表

链表是基础的数据结构,是一种线性表,它能够用通过顺序存储和链式存储两种方式。
采用顺序存储的可以建立如下结构体。

在这里插入图片描述 将所有的元素存储在数组中,这样建立的链表,链表的存储也比较方便,但是这样的链表缺少灵活性,而且是静态的,不能够任意增大链表的长度,操作起来不方便。

下面介绍链式存储的链表,也是常用的存储方式
在这里插入图片描述建立结构体,结构体中含有指向下一个节点的指针和元素的类型。
下面介绍链表的一些基本操作
在这里插入图片描述首先是建立一个空的链表,链表中有一个空节点,并指向NULL
在这里插入图片描述该函数的功能是计算该链表的总长度
在这里插入图片描述根据上面函数我们可以找到第k个节点所在的位置
在这里插入图片描述该函数可以找到第一个元素为x所在的节点

List insert(elementtype x, int i, List plist)  //插入一个新节点,插入在位置为在第i-1的后面,是第i个节点
{
	List p ;
	List s;
	if (i == 1)  //表示插入的节点在表头
	{
		s= new node[sizeof(struct node)];
		s->data = x;
		s->next = plist;
		return s;
	}
	else
	{
		p = findKth(i - 1, plist);
		if (p)
		{
			cout<<  "插入位置错误,另选择位置插入";
			return NULL;
		}
			
		else
		{
			s = new node[sizeof(struct node)];
			s->data = x;
			s->next= p->next;
			p->next = s;
			return plist;
		}

	}
	
	
}

该函数可以在任意位置插入一个新节点

List delete_list(int i, List plist)//删除第i个节点
{
	List p, s;
	if (plist == NULL)
	{
		return NULL;
	}
	else
	{
		if (i == 1)
		{
			s = plist;
			plist = s->next;
			delete s;
			return plist;

		}
		else
		{
			p = findKth(i - 1, plist);
			if (p == NULL || p->next == NULL)
			{
				cout << "该位置不存在";
				return NULL;
			}
			else
			{
				s = p->next;
				p->next = s->next;
				delete s;
				return plist;
			}
		}
	}
}

该函数删除任意节点

List reverse_list(int K,List plist )//逆转链表,k表示将前面k个节点进行逆转
{
	List head; //头结点
	List tmp; //下一个节点的位置
	List New;//已经完成逆转的链表
	List old;  //当前需要逆转的节点
	int cnt = 0;//计数器
	int length;
	length = list_length(plist);
	if (length < K)
	{
		cout << "链表长度小于所要逆转的节点个数";
		return NULL;
	}
	else
	{
		head = new node[sizeof(struct node)];
		head->next = plist;
		New = head->next;
		old = New->next;
		while (cnt < K-1)
		{	
			tmp = old->next;
			old->next = New;
			New = old;
			old = tmp;
			cnt++;
		}
		head->next = New; New->next = old;  //处理逆转完之后的头和尾部
		return New;
	}

}

该函数可以实现前K个元素的单链表逆转

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值