数据结构复习-线性表有关操作

数据结构复习-线性表有关操作

1.线性表反向和逆序
2.有序表的二分查找
3.有序表的归并
4.线性表的元素划分
5.顺序表循环移位
6.单向链表环问题:快慢指针
7.链表求倒数第k个数,中间数
8.单向链表交叉问题

一,反向和逆序

思路是从第二个数据节点开始每个节点先删除再头插

LinkListNode* reverse(LinkListNode *head)
{if(!head->next||!head->next->next)
return head;
else 
{
LinkListNode *p=head->next->next;
LinkListNode *q;
head->next->next=0;
while(p)
{
q=p->next;
p->next=head->next;
head->next=p;
p=q;
}

}
return head;

二、二分查找

ElementType BinarySearch(ElementType x,ElementType data[],int n)
{
	int l=0,r=n-1;
	int mid;
	while(l<=r)
	{
		mid=l+(r-l)/2;
		if(x<data[mid])
		r=mid-1;
		else if(x>data[mid])
		l=mid+1;
		else return data[mid];
	}
	return NULL; 
	
	
 } 

三、两个有序链表的归并

二路归并

 List Merge( List L1, List L2 )
 {
 	List L3=(List)malloc(sizeof(struct Node));// 
 	List pn=L3;
 	List p1=L1->Next,p2=L2->Next;
 	while(p1&&p2)
 	{
 		if(p1->Data<p2->Data)
 		{
		 pn->Next=p1;
 		pn=pn->Next;
 		p1=p1->Next;
 	}
 		else 
 		{
 			pn->Next=p2;
 		pn=pn->Next;
 		p2=p2->Next;
 			
		 }

	 }
pn->Next=p1?p1:p2;//只需将pn与还没连完的链表当前结点连上就行 
L1->Next=0;
L2->Next=0;
return L3;
 	
 	
 }

四、顺序表元素划分操作

其实就是快排操作

int partition(ElementType A[],int low,int high)
{
	int pivot=A[low];
	while(low<high)
	{
		while(low<high&&A[high]>=pivot)
		high--;
		A[low]=A[high];
		while(low<high&&A[low]<=pivot)
		low++;
		A[high]=A[low];
	}
	A[low]=pivot;
	return low;	
}

五、顺序表循环移位

void right_move(int *a,int N,int M)//每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
{
	int i,j,temp;
	for(j=0;j<M;j++)
	{temp=a[N-1];
	for(i=N-1;i>0;i--)
	a[i]=a[i-1];
		
	}
}

六、单向链表环问题

用快慢指针实现,判断环的入口结点只需要一个从指针从相遇点开始,一个指针从头结点开始,一步步往前走,相遇处就是环的入口结点

PtrNode  HaveCircle(PtrNode head)
{
	PtrNode p=head,q=head;
	while(p&&p->next)
	{
		p=p->next->next;
		q=q->next;
		if(p==q)
		return p;
		
	}
	return 0;

 } 
 PtrNode FindInNode(PtrNode head)
 {
 	PtrNode p=HaveCircle(head);
 	if(!p) return 0;
 	PtrNode q=head;
 	while(p!=q)
 	{
 		p=p->next;
 		q=q->next;
	 }
 	return q;
 
 }

七、求链表倒数第K个数,中间数

ElementType FindMid(PtrNode head)
{
	PtrNode p=head,q=head;
	while(p)
	{
		p=p->next->next;
		q=q->next; 
	}
	return q->data;
}
ElementType FindReverseKth(PtrNode head,int k)
{
	PtrNode p=head,q=head;
	int i;
	for(i=0;i<k;i++)
	{
		q=q->next;
	}
	while(q)
	{
		q=q->next;
		p=p->next;
	}
	return p->data;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值