使用せずreverse
に接続の要素を取得するにはどうすればよいですかlist
arrays
(私の問題であるポインターのみを使用する必要があります)。
使用せずreverse
に接続の要素を取得するにはどうすればよいですかlist
arrays
(私の問題であるポインターのみを使用する必要があります)。
ノードのコンテンツやスタックを交換する必要はありません。単一リンクリストを逆にしたい場合は、反復ループ内でポインターのペアと中間ポインターを使用してウォークします。終了したら、ヘッド ポインターを更新することを忘れないでください。
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);
と呼ばれるリストを考えてみ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();
}
}
リストをスタックのように扱い、要素をポップして新しいリストにプッシュします。