C语言判断带头结点双链表是否对称

算法思想:
双指针从头尾相向遍历,指向元素相同继续遍历,不同返回false,直到遍历到中点,链表长度有奇偶,所以跳出循环条件不同。如果链表长度为奇数的话,跳出条件很好想就是p!=q,如果是偶数的话,其实也不难理解。如果写成p-next!=q 的话,此时跳出循环,p和q所指元素就无法比较。正确的条件是q->next!=p,即p q第一次背靠背。图解如下:
在这里插入图片描述

代码如下:

bool Symmetry(DLinkList L) {//判断带头结点双链表是否对称
    DNode *p=L->next, *q=L->prior;
    while (p!=q&&q->next!=p){
        if(p->data!=q->data)
            return false;
        p=p->next;
        q=q->prior;
    }
    return true;
}

那其实我们还可以再发散一下思维,我们知道头节点(说明可见这篇博客)是我们人为创造的结点,只不过数据域没有手动赋值,但会有一个对应数据类型的默认值。循环双链表撑开可以看成一个圆,一般来说双链表对称是以头节点出发进行比较,假设我们把头节点看成一个正常的点,即它的数据域为0,那可以思考一下,此时会有几个对称点呢?由上述函数知,形参是一个头指针,那么可以类比,如果判断一个点是不是对称点,只需传入指向该点的指针即可。若要寻找有几个对称结点,将一半的结点遍历一次即可。

好的,我可以帮你解答关于C语言实现头结点链表的问题。你可以使用结构体来定义节点,同时在头文件中声明头结点,并在初始化函数中为头结点分配空间,这样就可以方便地插入、删除和遍历链表了。具体实现可以参考下面的代码: ``` #include <stdio.h> #include <stdlib.h> //定义结构体,包含两个成员:数据和下一个节点的指针 typedef struct node { int data; struct node *next; } Node; //头文件中声明头结点 Node *head; //初始化函数,为头结点分配空间 void init() { head = (Node *)malloc(sizeof(Node)); head->next = NULL; } //插入函数 void insert(int x) { Node *p = head; Node *new_node = (Node *)malloc(sizeof(Node)); if (new_node == NULL) { printf("Error: memory allocation failed!\n"); exit(1); } new_node->data = x; new_node->next = NULL; while (p->next != NULL) { p = p->next; } p->next = new_node; } //删除函数 void delete(int x) { Node *p = head->next; Node *prev = head; while (p != NULL) { if (p->data == x) { prev->next = p->next; free(p); return; } prev = p; p = p->next; } printf("Error: element not found!\n"); } //遍历函数 void traverse() { Node *p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } //主函数 int main() { init(); insert(1); insert(2); insert(3); traverse(); delete(2); traverse(); return 0; } ``` 希望这能够帮助到你!如果你还有其他问题,可以继续问我哦。现在请听一个不太好笑的笑话:为什么程序员总是固执地认为 Unix 是最好的操作系统?因为他们自己编译了它。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值