链表

链表的创建

   head为头节点,pend为尾节点,pnew为当前插入的节点

 

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int num;
	struct node *next;
};
int main()
{
	node *head,*pend,*pnew;
//	不带头节点的单链表 
//	int n=10;
//	while(n--)
//	{
//		pnew = (struct node*)malloc(sizeof(node));//为新节点申请空间 
//		pnew->num=n;//赋值 
//		pnew->next=NULL;//该节点的下一个节点为空 
//		if(head == NULL)//如果头部为空,代表这是第一次创建节点,设置这个节点为头节点 
//		{
//			head=pnew;
//			pend=head;
//		} 
//		else{//改节点不是头节点
//			pend->next=pnew;//让上一个节点的next等于这个节点(连接起来) 
//			pend=pnew;//让这个节点变为最后一个节点 
//		}
//	}
//  带头节点的单链表 
	head=(struct node*)malloc(sizeof(node));
	head->next=NULL;//头节点不存值,直接指向下一个节点 
	pend=head;
	int n=10;
	while(n--)
	{
		pnew =(struct node*)malloc(sizeof(node));
		pnew->num=n;//赋值 
		pnew->next=NULL; 
		pend->next=pnew;//连接起来 
		pend=pnew;//更新尾节点 
	} 
	return 0;
} 

以下都是以带头节点的单链表为例子(head头节点没有num值)

逆序输出单链表

void reversePrint(node *head)//逆序输出单链表 
{
	if(head==NULL) return ; 
	reversePrint(head->next);
	printf("%d\n" ,head->num);
}

链表的反转

 1.非递归

     p为原链表,newH为新链表

node* reverseList(node *H)
{
	if(H==NULL||H->next==NULL) return H;
	node *p=H,*newH;
	while(p)
	{
		node *temp =p->next;//先储存下一个节点 
		p->next=newH;//让下一个节点变为newH,与newH连接 
		newH=p;//newH拥有p节点的值 
		p=temp;//让p进入下一个节点 
	}
	return newH;
}

2.递归

node* In_reverseList(node *H)
{
	if(H==NULL||H->next==NULL) return H;
	node *newHead=In_reverseList(H->next);
	H->next->next=H;//H->next相当于newHead
					//newHead的下一个就是这个节点 
	H->next=NULL;//让这个节点的下一个为空,防止链表错乱 
	return newHead;
}

寻找倒数第k个数

node * findK(node *head,int k)
{//俩个指针,一个先走k步,第二个指针再开始走,当第一个到终点时,第二个的位置就是倒数第k个数
	node *p=head;
	for(int i=0;i<k;i++)
	{
		p=p->next;
	}
	node *q=head;
	while(p)
	{
		p=p->next;
		q=q->next;
	}
	return q;
} 

删除倒数第k个数

void erase(node *head,int k)//删除倒数第k个数 
{
	node  *p=findK(head,k+1);//先查找到倒数k+1个数,即k的前一个数
	p->next=p->next->next;
}

选择排序(升序)

void sortList(node * head)
{
	node *p=head;
	while(p)
	{
		node *q=p->next;
		while(q)
		{
			if(p->num>q->num)
			{
				int t=p->num;
				p->num=q->num;
				q->num=t;
			}
			q=q->next;	
		}
		p=p->next;
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值