【发布时间】:2021-04-03 14:39:14
【问题描述】:
如何使此代码适用于 m 的所有值,即 m=(1-10) 中的任何值 * 此代码用于反转链表的特定部分。此代码有效,但仅适用于 m
#include<iostream>
using namespace std;
struct Node
{
int data;
Node *next=NULL;
};
class LinkedList
{
Node *first=NULL,*last=NULL;
int no_of_nodes=10;
public:
LinkedList(int[],int);
~LinkedList();
void display(void);
void reverse(int m,int n);
};
LinkedList::~LinkedList()
{
Node *p=NULL;
for(int i=0;i<no_of_nodes;i++)
{
p=first;
for(int j=0;j<no_of_nodes-i-1;j++)
{
if(p->next==last)
{
delete(p->next);
p->next=NULL;
last=p;
}
else
{
p=p->next;
}
}
}
delete(first);
}
void LinkedList::reverse(int m,int n)
{
Node *prev=NULL,*pointer_m=first,*pointer_n=first;
//Making pointer_m to point on m-th node
for(int i=1;i<m;i++)
{
prev=pointer_m;
pointer_m=pointer_m->next;
}
//Making pointer_n to point on n-th node
pointer_n=first;
for(int i=1;i<n;i++)
{
pointer_n=pointer_n->next;
}
// reversing the list part between m and n
Node *p=first->next,*q=first,*r=prev; // q and r are tailing pointers
while(q!= pointer_n && p)
{
r=q;
q=p;
p=p->next;
q->next=r;
}
//fixing pointers
prev->next=pointer_n;
pointer_m->next=p;
}
LinkedList::LinkedList(int arr[],int n)
{
first=new Node;
first->data=arr[0];
last=first;
for(int i=1;i<n;i++)
{
Node *temp=new Node;
temp->data=arr[i];
last->next=temp;
last=temp;
}
}
void LinkedList::display(void)
{
Node *p=first;
// cout<<"No.of nodes:: "<<no_of_nodes<<"\t\t";
cout<<"List is:: ";
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main(void)
{
int arr[]={2,4,6,8,10,12,14,16,18,20};
int n=sizeof(arr)/sizeof(arr[0]);
LinkedList list(arr,n);
list.display();
list.reverse(5,8);
list.display();
return 0;
}
【问题讨论】:
-
是否允许在结构节点中添加上一个链接?这将使生活更轻松。
-
是的,我知道,但在这里我是链表的初学者,我刚开始学习单链表。我将用双向链表再次重复这个问题。但这里我只使用单链表。
-
虽然没关系,但我们使用的是单链表或双链表。我无法理解为什么这段代码不适用于 m 大于 5 的值
-
"while(q!= pointer_n && p)" in function reverse 看起来不完整?
-
节点 *p=first->next->next,*q=first->next,*r=first;在功能反转。首先应该是pointer_m?
标签: c++ linked-list reverse