链表数据复制轮换

Linked List data-copy rotation

我正在尝试生成一个函数,该函数可以将单个字符的链表向右旋转 space,而无需重新链接任何单个节点,即使用数据复制策略。

我尝试了多种方法,但在打印列表时似乎仍然无法产生所需的输出。

输出示例应为:

happy (before rotation)
yhapp (after rotation)

如有任何帮助,我们将不胜感激。

typedef struct _node {
      char data;
      strut _node *next;
} NodeT


void rightRotation(NodeT *head){
    if(head == NULL || head->next == NULL){

    }else{
        NodeT *temp1=head;
        NodeT *cur = head;
        NodeT *prev = head;
        char t1;
        while(cur->next != NULL){
            cur=cur->next;
            t1 = cur->data;
            cur->data=prev->data;
            prev=prev->next;
            cur->data=t1;
        } 
        temp1->data = cur->data;
    }

通常你只需将最后一个元素的next指针设置为第一个元素的地址,将倒数第二个元素的next指针设置为NULL,当然还有指针到列表的第一个元素 head->next.

要么你的函数需要更多信息,要么你仍然需要遍历单向链表: 例如,在第一种情况下,除了头元素的地址之外,您还需要倒数第二个元素的地址和最后一个元素的地址。

void rightRotation(NodeT *head, NodeT *tail, NodeT *secondLast){
    if(head == NULL || head->next == NULL){

    }else{
        tail->next = head;
        secondLast->next = NULL;
    }
}

在第二种情况下,您必须遍历单链表才能获得这些地址。

void rightRotation(NodeT *head){
    if(head == NULL || head->next == NULL){

    }else{
        NodeT *secondLast = NULL;
        NodeT *tail = NULL;
        NodeT *current = head;

        tail->next = head;
        secondLast->next = NULL;

        while(current->next != NULL){
            secondLast = current;
            tail = current->next;
            current = current->next;
        }
        tail->next = head;
        secondLast->next = NULL;
    }
}

其他块更改为:

NodeT *cur = head;
char t1 = cur->data;
while(cur->next != NULL){
    char t2 = cur->next->data;
    cur->next->data = t1;
    t1 = t2;
    cur = cur->next;
} 
head->data = t1;