力扣-重排链表

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; }

 

posted @ 2023-07-12 20:02  摆烂卧底  阅读(38)  评论(0)    收藏  举报