gpt4 book ai didi

c - 在给定值之后反转链表,而不创建新节点

转载 作者:行者123 更新时间:2023-11-30 20:14:00 24 4
gpt4 key购买 nike

我真的很坚持这个练习。我可以毫无问题地反转链表,但我不知道如何在不创建新节点的情况下做到这一点。

实现函数reverse()来反转链表中的元素从给定值第一次出现开始。例如给定输入 A B C D E F 和值 D,返回列表 A B C F E D

您应该就地执行此操作,而不创建新节点。

struct Node
{
struct Node* next;
int val;
};

void reverse( struct Node* head, int val);

你能给我一些建议吗?

这就是我现在所拥有的:

struct Node
{
struct Node* next;
int val;
};

void reverse(struct Node* head)
{
struct Node *p = head,
*q = NULL,
*r;
while (p != NULL)
{
r = q;
q = p;
p = p->next;
q->next = r;
}
q = head;
}

void reverseAfter( struct Node* head, int val )
{
while(head)
{
if(head->val == val)
reverse(head);
else
head = head->next;
}
}

最佳答案

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

typedef struct Node {
int val;
struct Node *next;
} Node;

void reverse(Node **head){
Node *tmp, *list, *newList = NULL;
if (head==NULL || *head == NULL) return;
list = *head;
while(list != NULL){
tmp = list;
list = list->next;
tmp->next = newList;
newList = tmp;
}
*head = newList;
}

void print(Node *head){
while(head){
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}

void reverseAfter(Node *head, int val){
//The first element excluded
if(head == NULL) return ;

while(head->next && head->next->val != val)
head = head->next;
reverse(&head->next);
}

int main(void){
Node *head;
Node n[6] = {
{1,NULL}, {2, NULL}, {3, NULL},
{4,NULL}, {5, NULL}, {6, NULL}
};
n[0].next = &n[1];n[1].next = &n[2];n[2].next = &n[3];
n[3].next = &n[4];n[4].next = &n[5];

head = &n[0];
print(head);//1 2 3 4 5 6
//reverse(&head);
reverseAfter(head, 4);
print(head);//1 2 3 6 5 4
return 0;
}

关于c - 在给定值之后反转链表,而不创建新节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28149808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com