我需要实现一个反转链表的函数,但我不知道如何返回一个新形成的链表。
typedef struct node_t* Node;
struct node_t {
int n;
Node next;
};
// create a new node with value n
Node nodeCreate(int n)
{
Node node = malloc(sizeof(*node));
if (node == NULL) return NULL;
node->n = n;
node->next = NULL;
return node;
}
// reversing the linked list
Node reverseList(Node list)
{
if (list == NULL) return NULL;
Node current, prev, next;
current = rev_head;
prev = NULL;
while( current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
list = prev;
return list;
}
这是我到目前为止编写的代码。
如何将此反向链接列表插入到自身reverseList
函数中的其他新链接列表中?
答案 0 :(得分:1)
您正在原始列表上的节点周围玩耍,然后就地修改 - 这意味着您只有一个列表,并修改其节点。
如果这是您想要的,那么您的代码可能会起作用(只要您修复了从无处出现的prev
变量之类的内容) - 以及列表的新头部,即{{1变量:这意味着你的代码应该可以工作。
(重要的是,typedef不会隐藏指针,我建议改变它。)
你似乎没有完全理解的是,对于这种结构,任何节点都作为列表的头部 - 没有“列表”类型,只有“节点”类型 - 如果你碰巧选择列表中间的任何节点,也只表示部分列表,也从该节点开始。因此,当您将之前的“最后”节点更改为指向其先前的“前任”作为其“下一个”时,就是它:该节点现在是头部。
(这个“node == list”等式的例外是,而正在运行反转算法 - 此时你有一个指向一个方向的节点和指向另一个方向的节点,以及额外的“next”和“prev”变量提供了解决问题所需的信息。如果这是生产代码,则必须在线程锁中保护这部分代码。
否则,如果您想生成列表的反向副本,则必须沿途复制旧节点,并修复它们指向的位置。
#include <stdlib.h>
#include <string.h>
typedef struct node_t Node;
struct node_t {
int n;
Node next;
};
// create a new node with value n
Node *nodeCreate(int n) {
Node *node = malloc(sizeof(*node));
if (node == NULL) return NULL;
node->n = n;
node->next = NULL;
return node;
}
void nodeCopy(Node *node_dst, Node *node_src) {
if (node_src == NULL || node_dst == NULL || abs(node_dst - node_src) < sizeof(Node)) {
return
}
memcpy(node_dst, node_src, sizeof(Node));
}
// reversing the linked list
Node *reverseList(Node *list) {
Node *new_list, *prev;
if (list == NULL) return NULL;
new_list = nodeCreate(0);
nodeCopy(new_list, list);
new_list->next=NULL;
prev = new_list;
while(list->next != NULL) {
list = list->next;
new_list = nodeCreate(0);
nodeCopy(new_list, list);
new_list->next=prev;
prev = new_list;
}
return new_list;
}
答案 1 :(得分:1)
您只需为原始列表中的每个节点创建一个新节点,然后按相反的顺序设置链接。代码可以是:
Node createReversedList(Node node) {
Node result = NULL;
while (node != NULL) {
Node n = nodeCreate(node->n);
n->next = result;
result = n;
node = node->next;
}
return result;
}
答案 2 :(得分:0)
您可以通过一种简单的方法来反向链接列表
您可以简单地创建一个新的链表并将每个节点添加到链表的开头,这将以相反的顺序创建相同的链表
Node* revList(Node *start){
Node *startRev=NULL,*temp,*newNode;
temp = start;
while (temp->next!=NULL){
newNode = (Node *) malloc (sizeof(Node));
//Code for copying data from temp to new node
if(startRev == NULL){
startRev = newNode;
}
else {
newNode->next = startRev;
startRev = newNode;
}
temp = temp->next;
}
return startRev;
}