方法一:T(n)=O(n),S(n)=O(n)

走完一遍链表,每个值入栈,之后再走一遍链表,和每次弹出的栈顶进行比较。

核心:

LNode *p = l->next;
while (p) {
s.push(p->data);
p = p->next;
}
p = l->next;
while (p) {
if (p->data != s.top()) {
cout << "fuck" << endl;
break;
}
s.pop();
p = p->next;
}
if (!p)cout << "" << endl;

完整:

#include <iostream>
#include <stack>
using namespace std;
typedef struct LNode {
struct LNode *next;
int data;
}*LinkList;
LinkList init() {
LinkList l = (LinkList)malloc(sizeof(LNode));
l->next = NULL;
return l;
} void push_back(LinkList l,int x) {
LNode *p = l;
LNode *s= (LNode *)malloc(sizeof(LNode));
s->data = x;
while (p->next) {
p = p->next;
}
s->next = p->next;
p->next = s;
} int main() {
int n;
stack<int>s;
LinkList l = init();
cin >> n;
for (int i = ; i < n; i++) {
int t;
cin >> t;
push_back(l, t);
}
LNode *p = l->next;
while (p) {
s.push(p->data);
p = p->next;
}
p = l->next;
while (p) {
if (p->data != s.top()) {
cout << "fuck" << endl;
break;
}
s.pop();
p = p->next;
}
if (!p)cout << "" << endl;
return ;
}

方法二:T(n)=O(n),S(n)=O(n)

用一个鬼畜(二倍速)指针,一个正常指针,当鬼畜指针到最后NULL时,正常指针正好到中间的位置(奇数),或者前半部分最后一个(偶数),然后将后半部分入栈,再一遍进行比较。

核心:

LNode *p = l->next,*pp=l->next;
while (pp&&pp->next) {
p = p->next;
pp = pp->next->next;
}
p = p->next;//数据为偶数的话,p是停在前半部分最后一个,数据为奇数的话,跳过中间一个没问题
while (p) {
s.push(p->data);
p = p->next;
}
p = l->next;
while (!s.empty()) {
if (p->data != s.top()) {
cout << "fuck" << endl;
break;
}
p = p->next; s.pop();
}
if (s.empty())cout << "" << endl;

完整代码:

#include <iostream>
#include <stack>
using namespace std;
typedef struct LNode {
struct LNode *next;
int data;
}*LinkList;
LinkList init() {
LinkList l = (LinkList)malloc(sizeof(LNode));
l->next = NULL;
return l;
} void push_back(LinkList l,int x) {
LNode *p = l;
LNode *s= (LNode *)malloc(sizeof(LNode));
s->data = x;
while (p->next) {
p = p->next;
}
s->next = p->next;
p->next = s;
} int main() {
int n;
stack<int>s;
LinkList l = init();
cin >> n;
for (int i = ; i < n; i++) {
int t;
cin >> t;
push_back(l, t);
}
LNode *p = l->next,*pp=l->next;
while (pp&&pp->next) {
p = p->next;
pp = pp->next->next;
}
p = p->next;//数据为偶数的话,p是停在前半部分最后一个,数据为奇数的话,跳过中间一个没问题
while (p) {
s.push(p->data);
p = p->next;
}
p = l->next;
while (!s.empty()) {
if (p->data != s.top()) {
cout << "fuck" << endl;
break;
}
p = p->next; s.pop();
}
if (s.empty())cout << "" << endl;
return ;
}

方法三:T(n)=O(n),S(n)=O(1)

同样用一个鬼畜(二倍速)指针,一个正常指针,不过这次,对后半部分 链表 进行反转。

从两个方向进行 遍历,到中间结束,这个过程中把原来反转的后半部分链表反转回去

链表反转:

void reverse(LinkList l) {
LNode *pre = NULL, *p = l->next;
while (p) {
LNode *t = p->next;
p->next = pre;
pre = p;
p = t;
}
l->next = pre;
}

核心:(这里反转是没有头结点的,要注意。代码量稍微长了一点,过段时间看该费点劲了)

LNode *p = l->next,*pp=l->next;
while (pp&&pp->next) {
p = p->next;pp = pp->next->next;
}
p = p->next;//和上一解法相同
LNode *pre = NULL;
while (p) {
LNode *t = p->next;
p->next = pre;
pre = p;
p = t;
}
p = l->next;
LNode *q = pre;
pre = NULL;
while (q) {
if (p->data != q->data) sign = ;//需要反转,不能break
LNode *t = q->next;
q->next = pre;
pre = q;
q = t;
p = p->next;
}
p->next = pre;

完整代码:

#include <iostream>
#include <stack>
using namespace std;
typedef struct LNode {
struct LNode *next;
int data;
}*LinkList; void push_back(LinkList l, int x) {
LNode *p = l;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
while (p->next) {
p = p->next;
}
s->next = p->next;
p->next = s;
} LinkList init() {
LinkList l = (LinkList)malloc(sizeof(LNode));
l->next = NULL;
int n;
cin >> n;
for (int i = ; i < n; i++) {
int t;
cin >> t;
push_back(l, t);
}
return l;
} int main() {
int n; int sign = ;
LinkList l = init();
LNode *p = l->next,*pp=l->next;
while (pp&&pp->next) {
p = p->next;pp = pp->next->next;
}
p = p->next;//和上一解法相同
LNode *pre = NULL;
while (p) {
LNode *t = p->next;
p->next = pre;
pre = p;
p = t;
}
p = l->next;
LNode *q = pre;
pre = NULL;
while (q) {
if (p->data != q->data) sign = ;//需要反转,不能break
LNode *t = q->next;
q->next = pre;
pre = q;
q = t;
p = p->next;
}
p->next = pre; if (!sign)
cout << "" << endl;
else
cout << "fuck" << endl;
return ;
}

随手练——S(n)=O(1),判断一个链表是否为“回文”的更多相关文章

  1. leetcode9_C++判断一个整数是否是回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 输出: true 示例 2: 输入: - 输出: false 解释: 从左向右读, 为 - ...

  2. 判断一个整数是否是回文数C++实现 leetcode系列(九)

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  3. Java判断一个字符串是否是回文

    package com.spring.test; /** * 判断字符串是否为回文 * * @author liuwenlong * @create 2020-08-31 11:33:04 */ @S ...

  4. js判断一个字符串是否是回文字符串

    回文字符串:即字符串从前往后读和从后往前读字符顺序是一致的. 如:字符串abccba,从前往后读是a-b-c-c-b-a:从后往前读也是a-b-c-c-b-a 方法一 function palindR ...

  5. 009 Palindrome Number 判断一个正整数是否是回文数

    详见:https://leetcode.com/problems/palindrome-number/description/ 实现语言:Java 方法一: class Solution { publ ...

  6. 判断一个链表是否为回文结构 【题目】 给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。 进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。

    方式1:借助栈 空间辅助度是O(N) 方式2: 借助栈 空间复杂度是 O(n/2).只存后半个链表 方式3: 反转后半个链表  最后再反转回来 package my_basic.class_3; im ...

  7. LeetCode 9、判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

    class Solution: def isPalindrome(self, x: int) -> bool: a = x if a<0: return False else: num = ...

  8. Java判断链表是否为回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 思路:1.通过快慢指针,来遍历链表 ...

  9. 用while判断输入的数字是否回文数

    /* Name:用while判断输入的数字是否回文数 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月18日 04:29:07 Description:用 ...

随机推荐

  1. BigDecimal 精准加减乘除

    解决了double和float精确度的问题 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效 ...

  2. Bean的自动装配及作用域

    1.XML配置里的Bean自动装配 Spring IOC 容器可以自动装配 Bean,需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式.自动装配方式有: by ...

  3. Java CountDownLatch解析(下)

    写在前面的话 在上一篇CountDownLatch解析中,我们了解了CountDownLatch的简介.CountDownLatch实用场景.CountDownLatch实现原理中的await()方法 ...

  4. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 不支持“variant”数据类型。

    mybatis执行sqlserver的sql报错 com.microsoft.sqlserver.jdbc.SQLServerException: 不支持“variant”数据类型. at com.m ...

  5. drupal7 转化 public:// 为实际url

    file_create_url('public://xxx.png'); // 得到URL drupal_realpath('public://xxx.png'); // 得到系统路径(磁盘路径,如D ...

  6. 远景GIS云上线

    没有发布会.没有嘉宾.没有掌声,趁着国庆假期悄悄地将系统部署到服务器上线运行. 远景GIS云(RGIS Cloud)基于自主研发的远景GIS基础平台开发,目前已实现了Shape上传和导出.符号配置.动 ...

  7. weixin设置菜单

    https://jingyan.baidu.com/article/925f8cb8dfcf11c0dce05661.html

  8. IIS支持http协议的:put、delete等方法

    HTTP常见方法:DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH 以下是从网上搜索的方法:其实经过测试,只配置最后那个web.config就可以实现这个功能: ...

  9. file cycle

    # Author:Alex# Date:2017.06.07# Version:3.6.0with open('james.txt') as jaf: data = jaf.readline() ja ...

  10. Mysql备份 -----innobackupex

    一,原理及介绍〇 xtrabackup能做哪些    对InnoDB引擎的表做热备    增量备份    流压缩传输到另外的服务器上    在线移动表    更简单的创建从库    备份时不增加服务器 ...