如何实现单链表交换任意两个元素(不包括头结点)
2017-03-28 16:37
381 查看
对于单链表而言,假设交换A、B两个节点,那么需要交换A与B的next指针以及A、B直接前驱的next指针。
需要注意特殊情况:1、当A与B相邻时:A->next = B;或者B->next = A;
2、当A和B元素相同时,则没有必要交换。
3、A与B有一个节点是头结点,不需要交换。
#include <iostream> #include <algorithm> #include "string.h" #include "stdio.h" #include <vector> #include <deque> #include<stack> using namespace std; struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class List{ public: ListNode* CreatList(int* arr,int len) { int val; ListNode* pHead = new ListNode(arr[0]); ListNode* pCurrent=NULL; ListNode* rear = pHead; int count = 1; while(count<len) { ListNode* pCurrent = new ListNode(arr[count]); rear->next = pCurrent; rear = pCurrent; count++; } rear->next = NULL; return pHead; } void ShowList(ListNode* pHead) { while(pHead) { cout<<pHead->val<<" "; pHead = pHead->next; } cout<<endl; } ListNode* GetLastNode(ListNode* pHead) { ListNode* pNode = pHead; while(pNode->next!=NULL) { pNode=pNode->next; } return pNode; } }; class Sort{ public: ListNode* changeList(ListNode* pHead,ListNode* pNode1,ListNode* pNode2) { if(pHead == NULL|| pNode1 == NULL || pNode2 == NULL) return pHead; //结点pNode1 等于pNode2 if(pNode1->val == pNode2->val) return pHead; if(pNode1->next == pNode2) { ListNode* pre = FindPre(pHead,pNode1); if(pre == NULL) return pHead; pre->next = pNode2; pNode1->next = pNode2->next; pNode2->next = pNode1; } else if(pNode2->next == pNode1) { ListNode* pre = FindPre(pHead,pNode2); if(pre == NULL) return pHead; pre->next = pNode1; pNode2->next = pNode1->next; pNode1->next = pNode2; } else if(pNode1!=pNode2){ ListNode* pre1 = FindPre(pHead,pNode1); ListNode* pre2 = FindPre(pHead,pNode2); ListNode* next1 = pNode1->next; ListNode* next2 = pNode2->next; pre1->next = pNode2; pNode2->next = next1; pre2->next = pNode1; pNode1->next = next2; } return pHead; } ListNode* FindPre(ListNode* pHead,ListNode* pNode) { ListNode* p = pHead; while(p) { if(p->next == pNode) return p; p = p->next; } return NULL; } }; int array[7]; int n; int number; int first; int second; int main() { cin>>n; for(int i=0;i<n;i++) { cin>>number; array[i]=number; } cin>>first; cin>>second; List list; Sort sort; ListNode* pHead1 = list.CreatList(array,sizeof(array)/sizeof(array[0])); ListNode* pNode1 = pHead1; ListNode* pNode2 = pHead1; for(int i=1;i<first;i++) { pNode1=pNode1->next; } cout<<pNode1->val<<endl; for(int i=1;i<second;i++) { pNode2 = pNode2->next; } cout<<pNode2->val<<endl; list.ShowList(pHead1); ListNode* p = sort.changeList(pHead1,pNode1,pNode2); //cout<<pEnd->val<<endl; list.ShowList(p); return 0; }
相关文章推荐
- 如何实现单链表任意两个元素交换(不包括表头)
- 7,单链表交换任意两个元素(不包括表头)
- 程序员面试题目总结--链表(7)【实现单链表交换任意两个元素(不包括表头)】
- 单链表交换任意两个元素(不包括表头)
- 交换单链表中任意两个元素(不包括表头)
- 交换单链表任意两个元素(完整程序)
- 7单链表交换任意两个元素(不包括表头)
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 【算法题】交换单链表任意两个元素
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 每天学习一算法系列(29)(有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小)
- 数据结构:交换单链表中的任意两元素--C实现
- 如何实现不依靠中间量实现两个变量值的交换
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 如何交换两个等长整形数组使其数组和的差最小(C和java实现)
- python列表中任意两个元素交换
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 10.1-2 说明如何用一个数组A[1..n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢,注意PUSH和POP操作的时间应为O(1)。