链接列表数据副本轮换

时间:2015-09-18 09:52:51

标签: c rotation singly-linked-list

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

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

输出的一个例子应该是:

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;
    }

2 个答案:

答案 0 :(得分:1)

否则阻止更改为:

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;

答案 1 :(得分:0)

通常,您只需将最后一个元素的next指针设置为第一个元素的地址,将第二个最后一个元素的next指针设置为NULL,当然也可以指向列表的第一个元素为head->next

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

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;
    }
}