数据结构复习-线性表有关操作
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;
}