我正在尝试生成一个函数,该函数可以将单个字符的链接列表旋转到一个空格,而无需重新链接任何单个节点,即使用数据复制策略。
我尝试了多种方式,但在打印列表时仍然无法生成所需的输出。
输出的一个例子应该是:
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;
}
答案 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;
}
}