【发布时间】:2015-05-21 05:26:33
【问题描述】:
我正在编写一个程序来检查单链表是否为回文。 我的做法如下:
- 创建单链表
- 反转列表并将其存储在另一个变量中
- 比较两者。
反向操作修改头指针。为了不修改头指针,我创建了一个temp 变量来指向头并用相同的方式反转列表并返回temp 指针。操作如下:
struct node* reverse()
{
struct node *temp=head;
struct node *curr=temp, *prev=NULL, *next=NULL;
while(curr!=NULL)
{
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
temp = prev;
return temp;
}
现在,我的回文函数实现如下:
int isPalindrome()
{
struct node *temp=head, *rev=head;
rev = reverse();
while(temp!=NULL)
{
if(temp->data != rev->data)
return 0;
temp = temp->next;
rev = rev->next;
}
return 1;
}
如果反向列表和原始列表节点不匹配,则返回0。否则返回1。
它适用于一些测试用例。但是当列表是 1->4->3->2->1 时。它返回 1 但它应该返回 0。
在锻炼时,我发现rev 函数修改了头指针。而现在,我的列表只有一个节点。
输出如下图所示:
- 第一个列表正在打印头指针未修改
- 第二个列表是反向列表
- 第三个列表是调用
reverse函数后打印原始列表
【问题讨论】:
-
嗯,反向列表和原始列表使用相同的节点,只能有一个方向。当您以相反的顺序重新排列它们时,原始顺序将丢失。如果您想拥有两个不同的列表,则必须进行“深拷贝”,即创建新节点作为现有节点的克隆。
-
最好的设计是使用双链表,我们可以减少逆向的步骤。
标签: c pointers reverse palindrome