程序员面试题目总结--链表(7)【实现单链表交换任意两个元素(不包括表头)】
2014-08-18 20:49
323 查看
7、实现单链表交换任意两个元素(不包括表头)
题目:实现单链表交换任意两个元素(不包括表头)
分析:假设交换的结点是A与B,那么需要交换A和B的next指针以及AB直接前驱的next指针,需要注意的特殊情况,当A和B相邻时,此时需要特殊处理,如果相同就不交换,如果A和B结点中有一个是表头,也不交换
题目:实现单链表交换任意两个元素(不包括表头)
分析:假设交换的结点是A与B,那么需要交换A和B的next指针以及AB直接前驱的next指针,需要注意的特殊情况,当A和B相邻时,此时需要特殊处理,如果相同就不交换,如果A和B结点中有一个是表头,也不交换
//实现单链表交换任意两个元素(不包括表头) #include<iostream> using namespace std; typedef struct node { int data; node *next; }linklist; linklist *head=NULL; //创建链表 linklist* CreateList(int* arr,int len) { int data; linklist* pCur,* pRear; head=(linklist*)malloc(sizeof(linklist)); pRear=head; int count=0; while(count<len) { pCur=(linklist*)malloc(sizeof(linklist)); pCur->data=arr[count]; pRear->next=pCur; pRear=pCur; count++; } pRear->next=NULL; return head; } //显示链表 void ShowList(linklist* p) { while(p) { cout<<p->data <<' '; p=p->next; } cout << endl; } /************************************************************************/ /* 假设交换的结点是A与B,那么需要交换A和B的next指针以及AB直接前驱的next指针, * 需要注意的特殊情况,当A和B相邻时,此时需要特殊处理,如果相同就不交换,如果A和B * 结点中有一个是表头,也不交换 /************************************************************************/ //找出p的前驱结点 linklist* FindPre(linklist* head,linklist* p) { linklist* q=head; while(q) { if(q->next==p) return q; else q=q->next; } return NULL; } //交换 linklist* Swap(linklist* head,linklist* p,linklist* q) { if(head==NULL || p==NULL || q==NULL) return head; if(p->data == q->data) return head; if(p->next == q) { linklist* pPre=FindPre(head,p); pPre->next=q; p->next=q->next; q->next=p; } else if(q->next == p) { linklist* qPre=FindPre(head,q); qPre->next=p; q->next=p->next; p->next=q; } else if(p!=q) { linklist* pre_p=FindPre(head,p); linklist* pre_q=FindPre(head,q); linklist* after_p=p->next; p->next=q->next; q->next=after_p; pre_p->next=q; pre_q->next=p; } return head; } int main() { int a[]={3,4,5,1,2,-1,7}; CreateList(a,sizeof(a)/sizeof(a[0])); ShowList(head->next); Swap(head,head->next->next,head->next->next->next); ShowList(head->next); return 0; }
相关文章推荐
- 7单链表交换任意两个元素(不包括表头)
- 如何实现单链表任意两个元素交换(不包括表头)
- 交换单链表中任意两个元素(不包括表头)
- 单链表交换任意两个元素(不包括表头)
- 7,单链表交换任意两个元素(不包括表头)
- 如何实现单链表交换任意两个元素(不包括头结点)
- 华为面试题 题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 数据结构:交换单链表中的任意两元素--C实现
- 第一次发博客,新手初试啊,题目如下:有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 【华为】题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求: 通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 建立单链表并交换表中任意两个元素
- 【学习点滴-数据结构-单链表】交换单链表中任意两个元素
- 程序员面试题目总结--链表(2)【找出单链表中的倒数第K个元素】
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- 程序员面试笔试——链表题目总结分析
- 【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小