我正在看一些面试问题,其中一个问题是要反转一个包含循环的链表.所以假设我有一个如下链接列表:
F <- E
| /\
V |
A -> B -> C -> D
Run Code Online (Sandbox Code Playgroud)
然后反转列表将创建以下内容:
F -> E
/\ |
| V
A <- B <- C <- D
Run Code Online (Sandbox Code Playgroud)
这里的问题是节点C应该指向哪个之间存在冲突.那么我们会消除C和F之间的联系吗?
我在C中提出了以下解决方案来反转字符串:
#include <stdio.h>
void reverse(char * head);
void main() {
char * s = "sample text";
reverse(s);
printf("%s", s);
}
void reverse(char * head) {
char * end = head;
char tmp;
if (!head || !(*head)) return;
while(*end) ++end;
--end;
while (head < end) {
tmp = *head;
*head++ = *end;
*end-- = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的解决方案是segfaulting.根据GDB,违规行如下:
*head++ = *end;
Run Code Online (Sandbox Code Playgroud)
在while循环的第一次迭代中,行segfaults.end指向字符串"t"的最后一个字符,head指向字符串的开头.那么为什么这不起作用呢?