赞
踩
1.重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为
1->5->2->4->3.
给定一个正整数数组 nums。
#include<stdio.h> #include<stdlib.h> #define N 15 typedef struct node{ int data; struct node*next; }ElemSN; ElemSN *creatlink(int a[]) { ElemSN *p,*head,*tail=NULL; for(int i=0;i<N;i++){ p=(ElemSN*)malloc(sizeof(ElemSN)); p->data=a[i]; p->next=NULL; if(!tail){ head=tail=p; } else{ tail=tail->next=p; } } return head; } void printlink(ElemSN*head){ for(ElemSN*p=head;p;p=p->next){ printf("%d\t",p->data); } } void inv_insert_printlink(ElemSN*head) { ElemSN*tail=NULL,*p,*q=NULL,*m=head->next,*n=head; for(p=head;p->next;p=p->next); tail=p; while(m!=q){ for(p=head;p!=tail;q=p,p=p->next); tail=q; q->next=p->next; //for(m=head,j=0;j<i;j++,n=m,m=m->next); if(m==q){ q->next=NULL; p->next=q; n->next=p; } else{ p->next=m; n->next=p; n=p->next; m=n->next; } } } int main() { int a[N]; for(int i=0;i<N;i++) a[i]=i+1; ElemSN*head; //创建链表 head=creatlink(a); printlink(head); //逆序插入链表 inv_insert_printlink(head); //输出插入后的链表 printf("\n"); printlink(head); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。