我是初学者并试图反转链表,所以在这里我写了一个函数来反转链表。
void reverse_list(struct node **head_ref)
{
struct node *temp = *head_ref;
if(temp == NULL)
return;
else if(temp->next == NULL)
return;
else
{
struct node *temp_r = temp;
int count = count_list(temp); // no.of nodes in the list
while(temp != NULL)
{
struct node *temp_t = temp_r;
int i;
for(i=0;i<count;i++)
{
if(i!=0)
temp_t = temp_t->next; // loop to find the node which is to be swapped with temp
}
if(temp_t == temp) // base condition to stop swapping
return;
else
{
swap_node(&temp_r,temp->data,temp_t->data);
}
temp = temp->next; // traverse through the list
count--;
}
}
}
我使用的逻辑:我想通过以这种方式(1,n),(2,n-1),(3,n-3)交换节点来反转链表。 。
但是当我执行此代码时,它只打印列表的第一个元素。
运行调试器后,我明白我制作了原始列表的两个副本,我实际上交换了两个不同列表的节点,这是代码中定义的函数swap_node()
无法实现的,这里是{{ 1}}功能
swap_node()
我想使用上面的逻辑反转链接列表,但我无法做到这一点,所以请有人帮助我实现这一点,我如何改进此代码以及如何继续。
提前。
答案 0 :(得分:1)
您的问题在while
循环中:
您不需要节点数,因为while
知道遍历列表。
另外,正如您已经知道的那样,应该有3个指针(前一个,当前一个和下一个)。
所以你的代码最终看起来像这样:
void reverse_list(struct node **head_ref) {
if(*head_ref == NULL || (*head_ref)->next == NULL)
return;
struct node *temp = *head_ref;
struct node *next = NULL;
struct node *pre = NULL;
while(temp != NULL)
{
next = temp->next;
temp->next = pre;
pre = temp;
temp = next;
}
*head_ref = pre;
}
注意如何更新列表的(原始)头部以指向相反的部分。
答案 1 :(得分:0)
实际上,您使用的算法太复杂用于反转链接列表。
while(currx && currx->data != key1)
{//btw, these code may cause bugs if there are some same value in the linked list
prevx = currx;
currx = currx->next;
}
上面的代码显示您并不真正了解链接列表的本质,在这些代码中,您只需处理链接列表,就像它是一个数组一样。这将使您的代码运行得非常缓慢,应该避免使用。
更好,更快地反转链表的方法如下:
struct Node
{
int dataa;
struct Node* next;
};
typedef struct Node* node;//some definition
node head = NULL;//global variables is not recommended in writing code ,but here it just make the code easier to read .
//Here you should do something to create the linked list
//eg: the linked list is 1 2 3 4 5 now ,the head pointer points at 1
void reverse(void)
{
if (head != NULL)
{
node temp1 = head->next;
node temp2 = head->next;
head->next = NULL;
while (temp2 != NULL)
{
temp2 = temp2->next;
temp1->next = head;
head = temp1;
temp1 = temp2;
}
}
}
//now it will be 5 4 3 2 1 ,the head pointer points at 5
只需逐个从头到尾反转列表。