力扣-重排链表
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.
2.输入说明
首先输入链表长度len,然后输入len个整数,以空格分隔。
3.输出说明
输出格式见范例
4.范例
输入:
5
1 2 3 4 5
输出:
head-->1-->5-->2-->4-->3-->tail
代码中创建的链表为无头结点单链表
5.思路
使用map对原链表进行映射,并使用vector根据存储节点位置访问地址。
Map是c++的一个标准容器,它提供了很好一对一的关系,map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。具体使用map的操作参考网上。
C++STL中verctor好比是C语言中的数组,但是vector又具有数组没有的一些高级功能。与数组相比,vector就是一个可以不用再初始化就必须制定大小的边长数组,当然了,它还有许多高级功能。具体使用vector的操作参考网上。
6.代码
//C++
#include<iostream> #include<stdio.h> #include<vector> #include<map> using namespace std; struct ListNode { int val; ListNode *next; ListNode() : val(0), next(NULL) {} ListNode(int x) : val(x), next(NULL) {} ListNode(int x, ListNode *next) : val(x), next(next) {} }; class Solution { public: ListNode *reorderList(ListNode* head) //对链表进行重新排序 { ListNode *p=head; std::vector<ListNode *>node_vec; //使用vector根据存储节点位置访问地址 std::map<ListNode *,int>node_map; int i=0; if(p==NULL) return head; while(p) { node_vec.push_back(new ListNode(p->val));//将新链表结点push到node_vec,生成了新链表结点位置到地址的map node_map[p]=i;//记录原始链表地址至结点位置的node_map p=p->next; i++; } node_vec.push_back(0); int n=i-1; i=0; while(i<n) { node_vec[i]->next=node_vec[n];//首先将第i个结点的next连接到第n个结点 i++; node_vec[n]->next=node_vec[i];//然后将第n个结点的next连接到下一个结点 n--; } node_vec[i]->next=NULL;//对连接完成后的结点的最后一个结点赋值为空 head=node_vec[0]; //返回新链表的第一个结点 return head; } }; ListNode *createByTail() { ListNode *head; ListNode *p1,*p2; int n=0,num; int len; cin>>len; head=NULL; while(n<len && cin>>num) { p1=new ListNode(num); n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; } return head; } void displayLink(ListNode *head) { ListNode *p; p=head; cout<<"head-->"; while(p!= NULL) { cout<<p->val<<"-->"; p=p->next; } cout<<"tail\n"; } int main() { ListNode* head = createByTail(); head=Solution().reorderList(head); displayLink(head); return 0; }

浙公网安备 33010602011771号