如何在链表中向后移动?

时间:2013-02-28 22:56:53

标签: c linked-list reverse

假设我有字符串“Lamps”,它会被传递到我的程序中,每个字符都存储在链接列表中的节点中。

我需要使用另一个链接列表以相反的顺序复制该列表,我该怎么做,我已经相当远了,但我如何在链表中向后移动?

您会看到该行评论了我需要在链接列表中向后移动的内容。

#include <stdlib.h>
#include <stdio.h>

struct NODE {
    struct NODE *next;  
    char data;

};


int main(int argc, char *argv[]) {

int i;

struct NODE *head;
struct NODE *current;
struct NODE *head2;
struct NODE *current2;
struct NODE *finger;


for(i = 0; i < argc; i++)
    printf("arg %d: %s\n", i, argv[i]);

head = (struct NODE*)malloc(sizeof(struct NODE));
    current = head;


    for ( i = 0; i < sizeof(argv[1]) - 1; i++ ) {

    current -> data = argv[1][i];
    current -> next = (struct node*)malloc(sizeof(struct NODE));
    current = current -> next;
    current -> next = NULL;

}


head2 = (struct NODE*)malloc(sizeof(struct NODE));
    current2 = head2;

    while ( current != head) {

        finger = head;


    while (finger -> next != current) 

        finger = finger -> next;
        current2 -> data = current -> data;
        current2 -> next = (struct node*)malloc(sizeof(struct NODE));
        current2 = current2 -> next;    
        // move backwards



    } // ends loop



}






return 0;

}

2 个答案:

答案 0 :(得分:5)

  

如何在(单个)链接列表中向后移动?

你没有。将一个列表反转为另一个列表的技巧是插入目标列表的头部而不是后部。您需要按照next指针以常规方式遍历原始列表,而不是将元素添加到目标列表的末尾,创建新节点,并用它替换目标的标头。 / p>

以下是一步一步的说明:

sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer   ^
targetHead -> NULL

sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer          ^
targetHead -> "A" -> NULL

sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer                 ^
targetHead -> "B" -> "A" -> NULL

sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer                        ^
targetHead -> "C" -> "B" -> "A" -> NULL

答案 1 :(得分:2)

简短的版本是使用prev变量扩展你的struct,当你创建一个子项时,你将self指定给它的Parent变量,因此你可以稍后从孩子读取它的父变量来向后移动一个 - 然后递归到一路走到顶端。