可能重复:
How to read a singly linked list backwards?
Reverse a LinkedList c++
如何在不使用reverse
list
联系arrays
的元素{{1}}
(我必须只使用指针解决我的问题)。
答案 0 :(得分:1)
您既不需要交换节点内容或堆栈。如果要反转单链表,只需在迭代循环中使用一对指针加上中间指针。完成后别忘了更新头指针;
void reverse_list(node **head)
{
node *cur=NULL, *nxt=NULL;
if (!(head || *head || (*head)->next))
return;
nxt = *head;
while (nxt != NULL)
{
node *prv = cur;
cur = nxt;
nxt = nxt->next;
cur->next = prv;
}
*head = cur;
}
假设列表节点是这样的:
typedef struct node
{
..data..
struct node *next;
} node;
并且管理得当,然后你这样调用:
node *head = NULL;
...fill the list...
reverse_list(&head);
答案 1 :(得分:0)
将列表视为堆栈,将元素弹出并将其推入新列表。
答案 2 :(得分:0)
考虑一个名为lst
的列表,它允许我们向后移动,即doubly linked list
您可以通过简单地交换开头和结束节点的内容来反转列表lst
void reverse(lst *beg,lst *end)
{
lst temp;
while(beg!=end)
{
//swap the content of the nodes
*temp=*beg;
*beg=*end;
*end=*temp;
beg=beg->Next();//move to next node
end=end->prev();//move to previous node
}
}
或强>
如果是singly linked list
,您可以使用stack
void reverse(lst* beg)
{
stack<lst*> stc;
lst* temp=beg;
lst* temp1=beg;
while(temp)//store pointers to lst nodes in stack
{
stc.push(temp);
temp=temp.Next();
}
while(temp1)//pop the stack by inserting it into list from beginning
{
*temp1=*stc.top();
temp1=temp1.Next();
stc.pop();
}
}