随手练——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:用 ...
随机推荐
- JAVA工具系列之——Postman
1 概述 Postman是一款测试rest接口的工具,可以实现前端未实施的情况下,后端同步开发.本文从部署到运用进行展开描写. 2 部署 第一步:进入Postman官网下载最新版本,下载链接 第二步: ...
- jetbrains激活 webstorm激活 webstorm激活码
License Activation的破解方式无效时,请采用以下方法1. 把下载的破解补丁放在你的idea的安装目录下的bin的目录下面(如下图所示),本文示例为C:\Program Files\Je ...
- git revert后导致合并代码丢失
起因 我有一个开发分支antd3.x和一个主分支develop,我在合并antd3.x到develop的时候发现有些修改没有合并进来. 查找问题 然后就去网上查,发现这篇文章<git合并丢失代码 ...
- svg矢量图标在html中的使用, (知识点:1.通过h5中的css实现点击变色,2.一个svg文件包含多个图标)
svg矢量文件体积小,不变形,比传统的png先进,比现在流行的icon-font灵活.然而在使用过程中还是遇到了很多坑.今天花了一天时间把经验整理出来,以供后来者借鉴.如果您从本文收益,请留言mark ...
- ant-design里为了清空Modal中的值, modal 中值有缓存 ....
处理列表中的编辑功能,发现有点爽,看的都是上次编辑后内容, 搜文档 也没说具体怎么清空旧的状态 网上搜了下,说给 moal 设置一个不同的key 试了,用这方式可以解决问题, 只要这个key是全新的 ...
- google学习
https://developers.google.com/machine-learning/crash-course/ https://developers.google.com/machine-l ...
- Django基础之Model操作
一.数据库操作 1.创建model表 基本结构: #coding:Utf8 from django.db import models class userinfo(models.Model): #如果 ...
- 排查 Azure 虚拟机的远程桌面连接问题
与基于 Windows 的 Azure 虚拟机 (VM) 的远程桌面协议 (RDP) 连接可能会因各种原因而失败,使用户无法访问 VM. 问题可能出在 VM 上的远程桌面服务.网络连接或主计算机上的远 ...
- Linux虚拟机将ip改为自定义模式网络
查看当前ip:ifconfig 配置linux的ip地址:vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO="dhcp" ...
- java 通过调用存储过程获取结果集
一般在java中,数据查询是通过Statement, PreparedStatement获取结果集,今天向大家介绍通过CallableStatement调用存储过程,从而获取结果集. 本 ...