【发布时间】:2018-12-29 02:15:03
【问题描述】:
我正在尝试将给定基于 0 的索引的单链表的两个节点交换到其中。在我的代码中,我处理了很多情况,但这种方法仅在j-i<=2 时有效。如果i和j之间有3个或更多的差异,我无法处理。
请帮助我纠正我的方法。
node* swap_nodes(node *head,int i,int j)
{
if(j<i)
{
int temp;
temp=i;
i=j;
j=temp;
}
node *prev1,*prev2,*temp1,*temp2;
if(i==j)
{
return head;
}
if(i==0 && abs(i-j)!=1)
{
int n=0;
node *temp=head;
prev1=head;
temp1=prev1->next;
while(n<j-1)
{
temp=temp->next;
n++;
}
prev2=temp;
temp2=prev2->next;
prev2->next=temp1;
temp1->next=prev1;
prev1->next=temp2->next;
temp2->next=prev2;
return temp2;
}
else if(abs(i-j)==1 && i!=0 )
{
int n=0;
node *temp=head;
while(n<i-1)
{
temp=temp->next;
n++;
}
prev1=temp;
temp1=prev1->next;
n=0;
while(n<j-i+1)
{
temp=temp->next;
n++;
}
temp2=temp;
prev1->next=temp2;
temp1->next=temp2->next;
temp2->next=temp1;
return head;
}
else if(i==0 && j==1)
{
temp1=head;
temp2=head->next;
node *temp3=temp2->next;
temp2->next=temp1;
temp1->next=temp3;
return temp2;
}
else
{
int n=0;
node *temp=head;
while(n<i-1)
{
temp=temp->next;
n++;
}
prev1=temp;
temp1=prev1->next;
n=0;
while(n<j-i)
{
temp=temp->next;
n++;
}
prev2=temp;
temp2=prev2->next;
prev1->next=temp2;
temp1->next=temp2->next;
temp2->next=prev2;
prev2->next=temp1;
return head;
}
}
【问题讨论】:
-
您的算法似乎太复杂了。不应该有任何 abs() 需要。首先查找
i之前的节点和j之前的节点(如果它们存在或者head 是i或j) -
我认为您是在谈论单链表并希望根据它们的索引交换两个节点?
-
如果交换两个节点,则数据将与节点交换交换,因此,如果您不想交换数据,则只需移动指针而不影响列表中的数据(即不计算指针是没有净可见效果的),那么你为什么想要这个?
-
@crashmstr 因为在大节点中交换数据(例如:半兆字节的图像数据)比指针竞争更昂贵。交换几个指针比交换半兆节点数据要快得多。
-
所以,要明确一点:您想通过交换两个条目的位置来更改链接列表的顺序,而不是将数据物理复制到新节点中?一种方法是在节点中添加交换方法:-)
标签: c++ c++11 linked-list singly-linked-list