随手练——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:用 ...
 
随机推荐
- Mongodb操作之查询(循序渐进对比SQL语句)(转http://www.tuicool.com/articles/UzQj6rF)
			
工具推荐:Robomongo,可自行百度寻找下载源,个人比较推荐这个工具,相比较mongoVUE则更加灵活. 集合简单查询方法 mongodb语法:db.collection.find() //co ...
 - mac平台安装配置TomCat
			
1.下载Tomcat 7.0 地址:http://tomcat.apache.org/download-70.cgi Binary Distributions -> Core 选择zip或tar ...
 - 13、IO (File、递归)
			
File File类的概述和作用 * A:File类的概述和作用 * a: File的概念 * File类是文件和目录路径名的抽象表示形式 * Java中把文件或者目录(文件夹)都封装成File对象 ...
 - 撩课-Python-每天5道面试题-第3天
			
一. 代码实现: 计算1到100之间, 所有的奇数之和 result = , ): result += i print(result) 二. 代码实现: 接收用户输入数字, 求出从0至这个数字的累加和 ...
 - 【SSH网上商城项目实战05】完成数据库的级联查询和分页
			
转自:https://blog.csdn.net/eson_15/article/details/51320212 上一节我们完成了EasyUI菜单的实现.这一节我们主要来写一下CategorySer ...
 - 洛谷P4781 【模板】拉格朗日插值(拉格朗日插值)
			
题意 题目链接 Sol 记得NJU有个特别强的ACM队叫拉格朗,总感觉少了什么.. 不说了直接扔公式 \[f(x) = \sum_{i = 1}^n y_i \prod_{j \not = i} \f ...
 - 《CSS3揭秘》上(边框,投影,渐变,条纹效果,蚂蚁行军)
			
最近看了<CSS3揭秘>一书,里面真的是干货满满呀,现将常用到的一些技巧归纳总结,便于日后用到查找.不得不感叹学无止境哦~ 1.边框与背景 半透明边框 .demo{ background- ...
 - mac关闭渐隐和弹出动画效果
			
苹果系统应用程序的窗口和对话框每次使用的时候都有华丽的特效,但是如果你感觉这种特效显得有点慢(MacGG闲的蛋疼),那该如何取消掉他呢? 方法很简单,打开"终端"(Finder-& ...
 - Two references point to the same heap memory
			
Phone类 package com.itheima_03; /* * 手机类 */ public class Phone { String brand; int price; String colo ...
 - java基础问题解答
			
Java学习中的问题 一 枚举类型: 下面是一段源程序代码: package Demo; public class Enum { public static void main(String[] ...