【算法题】交换单链表任意两个元素
来源:互联网 发布:淘宝批量设置运费模板 编辑:程序博客网 时间:2024/05/22 06:26
- 首先添加虚拟头结点
- 然后找到指定节点的前驱节点
- 再然后分两种情况进行交换:相邻节点交换和非相邻节点交换
#include <iostream>#include <vector>#include <numeric>#include <algorithm>using namespace std;struct ListNode{ ListNode* next; int value;};bool List_insert(ListNode ** phead, int x, int i){//空指针 if (phead == NULL) { return 0; } ListNode * pCurrent(NULL);//头插入 if (i==1) { pCurrent = *phead; ListNode * pNew = new ListNode; pNew->value = x; pNew->next = pCurrent; *phead = pNew; return 1; }//非头插入 pCurrent = *phead; ListNode * pfront(NULL); int k(1); while (k < i && pCurrent != NULL) { pfront = pCurrent; pCurrent = pCurrent->next; k++; } if (k != i) { return 0; } ListNode * pNew = new ListNode; pNew->value = x; pNew->next = pCurrent; pfront->next = pNew; return 1;}void List_print(ListNode * phead){ while (phead!=NULL) { cout << phead->value; phead = phead->next; } cout << endl;}ListNode * findpre(ListNode* phead,int v)//寻找前驱节点{ if (phead==NULL) { return phead; } for (auto i = 0; i < v-1;i++) { if (phead!=NULL) { phead = phead->next; } } return phead;}ListNode* swapnode(ListNode * head,int v1,int v2)//交换第v1和v2个节点{ if (head==NULL|| head->next==NULL||v1==v2) { return head; } ListNode dummy; dummy.next = head; if (v1>v2) { std::swap(v1, v2); } ListNode * v1_pre = findpre(&dummy, v1); ListNode * v2_pre = findpre(&dummy, v2); if (v2_pre == NULL||v2_pre->next == NULL) { return head; } if (v1_pre->next == v2_pre)//相邻v1 == v2_pre { ListNode* v2_node = v2_pre->next; v1_pre->next = v2_node; v2_pre->next = v2_node->next; v2_node->next = v2_pre; } else { ListNode * v1_node = v1_pre->next; ListNode * v2_node = v2_pre->next; std::swap(v1_node->next, v2_node->next); std::swap(v1_pre->next, v2_pre->next); } return dummy.next;}int main(){ ListNode * phead = NULL; List_insert(&phead, 1, 1); List_insert(&phead, 2, 1); List_insert(&phead, 3, 1); List_insert(&phead, 4, 1); List_insert(&phead, 5, 1); List_insert(&phead, 6, 1); List_print(phead); phead = swapnode(phead,5,7 ); List_print(phead); phead = swapnode(phead, 5, 1); List_print(phead); return 0;}
阅读全文
0 0
- 【算法题】交换单链表任意两个元素
- 单链表交换任意两个元素(不包括表头)
- 【学习点滴-数据结构-单链表】交换单链表中任意两个元素
- 7,单链表交换任意两个元素(不包括表头)
- 交换单链表任意两个元素(完整程序)
- 7单链表交换任意两个元素(不包括表头)
- 如何实现单链表任意两个元素交换(不包括表头)
- 建立单链表并交换表中任意两个元素
- 程序员面试题目总结--链表(7)【实现单链表交换任意两个元素(不包括表头)】
- 交换单链表中任意两个元素(不包括表头)
- 交换单链表的任意两个节点
- 交换两个元素
- 数据结构:交换单链表中的任意两元素--C实现
- 两个元素内容的交换
- 交换两个数组中的元素
- 两个数交换算法
- 交换数组的任意2个元素
- 交换任意两个数的宏
- LINUX设备驱动程序(第3版)[高清PDF]
- PHP 常用字符串相关函数
- 欢迎使用CSDN-markdown编辑器
- 每日一题 No.55 Conscripttion
- 使用git恢复未提交的误删数据
- 【算法题】交换单链表任意两个元素
- Python3 JSON
- typedef 的一些小问题
- 深入Linux内核架构(中文版)pdf
- Git 分支命名
- Android N上Popwindow显示位置不正确问题
- JAVA-JDBC: (3)操作日期类型和CLOB、BLOB类型
- 【JavaSE系列-基础篇7】——运算符
- 图解性能优化pdf