我怎么能回到单链表?

时间:2013-07-01 21:41:20

标签: singly-linked-list

我有一个单独的链表。从列表中的每个节点,我可以到达下一个元素。是否有可能转到前一个元素?请注意,由于内存限制,我无法使用双向链表。

4 个答案:

答案 0 :(得分:0)

你不能,你必须使用双链表,你有一个指向前一个和下一个元素的指针。单个链接列表只是指向下一个元素,并且不会跟踪先前的元素。

试试这个: http://en.literateprograms.org/Doubly_linked_list_(Java)

答案 1 :(得分:0)

如果必须使用单链表,那么解决此问题的一种方法是再次遍历列表,直到找到前一项。当Next字段等于当前项时,您将知道何时处于上一项。

伪C代码:

Node* GetPreviousNode(Node* currentNode)
{
    Node* iteratorNode = GetHeadNode();
    while (iteratorNode != NULL)
    {
        if (iteratorNode->Next == currentNode)
            return iteratorNode;

        iteratorNode = iteratorNode->Next;
    }
    return NULL;
}

答案 2 :(得分:0)

有两种不同的方法可以双向遍历单链表。

方法1:(结构的)链接字段实际上是“差异”字段。链接计算 因为下一个项目的地址减去前一个项目的地址,因此......

next =前一项的地址+当前项的链接。   prev =下一个项目的地址 - 当前项目的链接。

如果您可以使用指针进行算术运算,那么您将开展业务。如果没有,你将不得不使用一个联合(在C ++中)或使用方法2.参见:算法+数据结构=程序由Niklaus Wirth - Prentice-Hall 1976年 - 第19页。

方法2:链接字段是具有地址的前一项的地址的“异或”(^) 下一个项目。排他性或与自身相反,因此......

next =前一项的地址^当前项的链接。   prev =下一个项目的地址^当前项目的链接。

答案 3 :(得分:0)

如果您有一个确定的节点,它位于单链表中的给定节点之前,那么您可以创建一个函数: -

    struct node* prev(struct node* before, struct student_detail* current)
    {
        struct student_detail* temp = before;
        while (temp->next != NULL)
        {
            if(temp->next == current)
            {
                return temp;
            }

            temp = temp-> next;
        }
        return NULL;
    }

并在

中使用它
    example_node = prev(before, example_node);

如果您有头,您可以随时将其用作prev节点。