【问题标题】:Linked List data-copy rotation链表数据复制轮换
【发布时间】:2015-09-18 09:52:50
【问题描述】:

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

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

输出的一个例子应该是:

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

【问题讨论】:

  • 显示更多代码。例如我们不知道NodeT 是什么。

标签: c rotation singly-linked-list


【解决方案1】:

else 块改成这样:

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;

【讨论】:

  • 这仍然有一个缺点,即您正在复制数据而不是更改列表元素的顺序。
  • @gmug 列表的顺序没有改变。 OP想要“不重新链接任何单个节点”
  • 虽然它可能会说如果data 非常大或复合类型,这种策略是不利的。我认为在这种情况下不能说是劣势(char data)。
【解决方案2】:

通常你只需将最后一个元素的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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2011-03-11
    • 2017-07-20
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多