判断单链表是否中心对称

简介: 判断单链表是否中心对称

设单链表的表头指针为L,结点结构由data和next两个域构成,其中data为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。

算法思想:将链表前半部分存入栈中,然后依次出栈和链表后半部分比较。如果长度为奇数时跳过中间元素,与后半段比较。


注意一个点,while(p),p是遍历指针,代码段总是报空指针异常,我就很纳闷,为什么最后一个结点的next,能进入循环。

查看结构体发现,next指针并未初始化为NULL,实际指向内存随机一块空间,如果构建单链表的时候不把表尾指向NULL,就会导致next进入循环。

#include<iostream>
#include<stack>
using namespace std;
//判断链表字符是否中心对称
//算法思想:将链表前半部分存入栈中,然后依次出栈和链表后半部分比较。
typedef struct LNode {//本名
  char data;    //数据域
  struct LNode* next; //指针域
}LNode, * LinkList;//别名,LinkList代表表头
LinkList List_tailInsert(LinkList& L) {
  LNode* s; LNode* r; char x;int length = 0;
  L = (LinkList)malloc(sizeof(LNode));
  L->next = NULL;
  r = L;
  cout << "输入链表长度" << endl;
  cin >> length;
  cout << "输入元素" << endl;
  while (length)
  {
    cin >> x;
    s = (LinkList)malloc(sizeof(LNode));
    s->data = x;
    r->next = s;
    r = s;
    length--;
  }
  r->next = NULL;
  return L;
}
void show(LinkList L) {
  LNode* p = L->next;
  while (p) {
    cout << p->data;
    p = p->next;
  }
  cout << endl;
}
bool judegement(LinkList L, int n) {
  stack<char> s;
  LNode* p = L->next;
  for (int i = 0; i < n / 2; i++) {
    s.push(p->data);
    p = p->next;
  }
  if (n % 2 == 1)p = p->next;
  while(p) {
    if (p->data == s.top()) {
      s.pop();
      p = p->next;
    }
    else {
      return false;
    }
  }
  return true;
}
int main() {
  LinkList l;
  List_tailInsert(l);
  show(l);
  cout << judegement(l,5) << endl;
}
相关文章
|
3天前
|
算法
判断单链表是否有环?中点如何判断?入环点如何判断?
判断单链表是否有环?中点如何判断?入环点如何判断?
|
3天前
20005.LeetCode 876. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。
20005.LeetCode 876. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。
24 0
|
3天前
快慢指针判断环形链表
快慢指针判断环形链表
|
7月前
【Leetcode -剑指Offer 22.链表中倒数第k个结点 -203.移除链表元素】
【Leetcode -剑指Offer 22.链表中倒数第k个结点 -203.移除链表元素】
18 0
|
11月前
1.移除链表元素 2.反转链表 3.链表的中间结点
1.移除链表元素 2.反转链表 3.链表的中间结点
52 0
|
11月前
每日一题—— 判断一个链表是否为回文结构(快慢指针,对撞指针)
每日一题—— 判断一个链表是否为回文结构(快慢指针,对撞指针)
|
11月前
[leetcode]19 删除链表的倒数第 N 个结点 | 链表模拟
[leetcode]19 删除链表的倒数第 N 个结点 | 链表模拟
53 0
|
存储
从尾到头打印链表
从尾到头打印链表 1、题目 2、思路 3、代码
|
存储 索引
使用双指针方法来判断链表是否是一个会问链表
使用双指针方法来判断链表是否是一个会问链表
96 0
使用双指针方法来判断链表是否是一个会问链表