使用指针反转列表的元素

时间:2012-11-02 17:41:51

标签: c++ arrays algorithm list pointers

  

可能重复:
  How to read a singly linked list backwards?
  Reverse a LinkedList c++

如何在不使用reverse

的情况下list联系arrays的元素{{1}}

(我必须只使用指针解决我的问题)。

3 个答案:

答案 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();
    }
}