随手练——S(n)=O(1),判断一个链表是否为“回文”
方法一: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),判断一个链表是否为“回文”的更多相关文章
- leetcode9_C++判断一个整数是否是回文数
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 输出: true 示例 2: 输入: - 输出: false 解释: 从左向右读, 为 - ...
- 判断一个整数是否是回文数C++实现 leetcode系列(九)
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- Java判断一个字符串是否是回文
package com.spring.test; /** * 判断字符串是否为回文 * * @author liuwenlong * @create 2020-08-31 11:33:04 */ @S ...
- js判断一个字符串是否是回文字符串
回文字符串:即字符串从前往后读和从后往前读字符顺序是一致的. 如:字符串abccba,从前往后读是a-b-c-c-b-a:从后往前读也是a-b-c-c-b-a 方法一 function palindR ...
- 009 Palindrome Number 判断一个正整数是否是回文数
详见:https://leetcode.com/problems/palindrome-number/description/ 实现语言:Java 方法一: class Solution { publ ...
- 判断一个链表是否为回文结构 【题目】 给定一个链表的头节点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 ...
- LeetCode 9、判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
class Solution: def isPalindrome(self, x: int) -> bool: a = x if a<0: return False else: num = ...
- Java判断链表是否为回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 思路:1.通过快慢指针,来遍历链表 ...
- 用while判断输入的数字是否回文数
/* Name:用while判断输入的数字是否回文数 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月18日 04:29:07 Description:用 ...
随机推荐
- C# 多维数组
int[, ,] shuzu = new int[4, 3, 2]; //有四个二维数组,每个二维数组里面有3个1维数组,每个1维数组里面有2个元素
- SmartGit破解使用的个人方法
转自:https://www.cnblogs.com/nn839155963/p/5912788.html SmartGit是收费的,可以30天的试用期,30天试用期过后,smartgit 需要输入序 ...
- 二、spark SQL交互scala操作示例
一.安装spark spark SQL是spark的一个功能模块,所以我们事先要安装配置spark,参考: https://www.cnblogs.com/lay2017/p/10006935.htm ...
- 5、static、final、匿名对象、内部类、包、修饰符、代码块
final关键字 final关键字概念 * A: 概述 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承, 或者有些类中的部分方法功能是固定的,不想让子类重写. ...
- 记一次tomcat自动退出问题
问题 环境: centos/tomcat8/jdk1.8 最近遇到部署在服务器的tomcat总是过一段时间就自动结束进程 ; 通过监控tomcat 日志文件(tail -f ./logs/catali ...
- MongoDB客户端及监控工具
现在许多应用都使用MongoDB存储大量的业务数据,MongoDB基于文档式的存储,在大数据行业的应用还是很普遍的.MongoDB的客户端工具也很多,基于web的却不多,国产的就更少了,下面这款国产的 ...
- oauth2.0授权协议
参考文章 一.OAuth是什么? OAuth的英文全称是Open Authorization,它是一种开放授权协议.OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和 ...
- 《JavaWeb从入门到改行》多重外键关系在java中的处理方案
目录:(点击红色方框展开子目录) 问题描述 无 项目案例说明 业务描述 数据库说明 项目源码及下载 无 问题描述 如上两图,数据库中各个表之间有很多的外键关系,其中业务关系是一个用户下有该用户的订单, ...
- CodeChef SADPAIRS:Chef and Sad Pairs
vjudge 首先显然要建立圆方树 对于每一种点建立虚树,考虑这一种点贡献,对于虚树上已经有的点就直接算 否则对虚树上的一条边 \((u, v)\),\(u\) 为父亲,假设上面连通块大小为 \(x\ ...
- LintCode2016年8月8日算法比赛----中序遍历和后序遍历构造二叉树
中序遍历和后序遍历构造二叉树 题目描述 根据中序遍历和后序遍历构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下 ...