单链表建立删除和就地逆置

#include <iostream>
using namespace std;

typedef struct linklist{
	linklist *link;
	int val;
}*listPoint;
//链表插入思想来自C与指针,链表处理不带头结点。
void insertType2(linklist **linkp,int new_val)
{
	listPoint current;
	listPoint new_linklist_point;
	while ((current=*linkp)!=NULL&¤t->val<new_val)
	{
		linkp=¤t->link;
	}
	new_linklist_point=new linklist;
	if (new_linklist_point==NULL)
	{
		cout<<" memory new errors \n";
	}
	new_linklist_point->val=new_val;
	new_linklist_point->link=current;
	*linkp=new_linklist_point;
}
//这种操作直观好理解,但是需要单独考虑特殊情况
void insertType1(linklist **head,int new_val)
{
	listPoint current,previous,new_linklist;
	current=*head;
	previous=NULL;
	while (current!=NULL&¤t->val<new_val)
	{
		previous=current;
		current=current->link;
	}
	new_linklist=new linklist;
	if (new_linklist==NULL)
	{
		cout<<"memorty errors\n";
	}
	new_linklist->val=new_val;
	new_linklist->link=current;
	if (previous==NULL)//如果为第一个插入链表节点
	{
		*head=new_linklist;
	}
	else
		previous->link=new_linklist;
}
//输出链表没有头结点情况
void PrintLinklistWithOutfirstNode(listPoint head)
{
	if (head==NULL)
	{
		cout<<"empty linklist \n";
	}
	while (head)
	{
		cout<<head->val<<" ";
		head=head->link;
	}
	cout<<endl;
}
//输出链表有头结点情况
void PrintLinklistWithfirstNode(listPoint head)
{
	if (head->link==NULL)
	{
		cout<<"empty linklist \n";
	}
	while (head->link)
	{
		cout<<head->link->val<<" ";
		head=head->link;
	}
	cout<<endl;
}

//链表反转需要头结点。
linklist *reverseLinklist(listPoint head)
{
	linklist *p,*q;
	//判断链表至少有两个元素
	if (head->link->link&&head->link)
	{
		p=head->link;
		q=p->link;
		p->link=NULL;
		while (q)
		{
			p=q;
			q=q->link;
			p->link=head->link;
			head->link=p;
		}
	}
	return head;
}
//这个是没有头结点链表反转
linklist *reverseLinklistWithoutNode(listPoint current)
{
	listPoint pre,next;
	for (pre=NULL;current!=NULL;current=next)
	{
		next=current->link;
		current->link=pre;
		pre=current;
	}
	return pre;
}
void delete_linklistNode(listPoint &head,int delete_num)
{
	listPoint pre,current,next;
	for (pre=NULL,current=head;current!=NULL;current=next)
	{
		next=current->link;
		if (current->val==delete_num)
		{
			if (pre==NULL)
			{
				head=head->link;
			}
			else
			{
				pre->link=current->link;
			}
			break;
		}
		pre=current;
	}
}
int main()
{
	int a[]={1,2,7,8,3,4};
	listPoint head=NULL;
	for (int i=0;i<6;i++)
	{
		insertType1(&head,a[i]);
	}
	listPoint root=new linklist;
	root->link=head;
	PrintLinklistWithOutfirstNode(head);
	delete_linklistNode(head,8);
	PrintLinklistWithOutfirstNode(head);
	PrintLinklistWithOutfirstNode(reverseLinklistWithoutNode(head));	
	//PrintLinklistWithfirstNode(reverseLinklist(root));
}
单链表两种情况一种是带头结点的,一种不带头结点,这里实现的是不带头结点。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值