以下是一次反转链接列表k元素的元素的函数, 我的问题是,如果我将null作为头传递,函数是否会崩溃,因为,在这种情况下,next永远不会初始化为任何值,因为它可能指向垃圾值,if(next!= null)可能是满意,所以语句head-> next可以执行,当head实际为null时,导致程序崩溃?
struct node *reverse (struct node *head, int k)
{
struct node* current = head;
struct node* next;
struct node* prev = NULL;
int count = 0;
/*reverse first k nodes of the linked list */
while (current != NULL && count < k)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
count++;
}
/* next is now a pointer to (k+1)th node
Recursively call for the list starting from current.
And make rest of the list as next of first node */
if(next != NULL)
{ head->next = reverse(next, k); }
/* prev is new head of the input list */
return prev;
}
答案 0 :(得分:1)
如果将头传递为NULL
,则跳过while循环,语句if(next != NULL)
会将未初始化的指针与NULL进行比较,这是未定义的行为。
所以是的,你的程序可能会崩溃。
未指定单位化指针所包含的内容,并且与实现有关。
答案 1 :(得分:0)
对你的问题的严格回答是:不,不太可能。
鉴于head == 0
和k > 0
,您最终会在函数的第21行使用next != 0
(最有可能),但有一些垃圾随机值(正如您所指出的那样)将用于您的递归通话。
你的代码可能在第一次崩溃时不会崩溃,但它很可能在某个时候崩溃,或者继续递归一段未知的时间。无论如何,你不会得到你期望的结果。