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