在O(n) 时间复杂度,O(1)空间复杂度内反转单链表
在LeetCode中看到判断回文的程序:https://leetcode.com/problems/palindrome-linked-list/
里面用单链表来存储数据,先反转前半部分的单链表,然后分别从 表头 和 中间链表位置处 开始比较元素。
反转单链表的代码如下:
1 private ListNode reverseList(ListNode head, int length){
2 if(head == null)
3 return null;
4 ListNode currentNode, preNode;
5 currentNode = preNode = head;
6 ListNode nextNode = head.next;
7 head.next = null;
8 for(int i = 1; i < length; i++){
9 if(nextNode != null){
10 currentNode = nextNode;
11 nextNode = nextNode.next;
12 currentNode.next = preNode;
13 preNode = currentNode;
14 }
15 }
16 return currentNode;
17 }
完整代码如下:
public class ReverseList { public static void main(String[] args) {
ListNode head = new ListNode(0);
ListNode node1 = new ListNode(1);
head.next = node1;
ListNode node2 = new ListNode(2);
node1.next = node2;
ListNode node3 = new ListNode(3);
node2.next = node3; print(head);
System.out.println();
ListNode newHead = reverseList(head);
print(newHead);
} public static ListNode reverseList(ListNode head) {
if (head == null) {
return null;
} ListNode currentNode,nextNode,preNode;
currentNode = preNode = head;
nextNode = head.next; head.next = null;
while (nextNode != null) {
currentNode = nextNode;
nextNode = nextNode.next;
//reverse
currentNode.next = preNode;
preNode = currentNode;
} return currentNode;
} private static class ListNode{
private int val;
private ListNode next; public ListNode(int val) {
this.val = val;
}
} private static void print(ListNode head) {
while (head != null) {
System.out.print(head.val + " ");
head = head.next;
}
}
}
在O(n) 时间复杂度,O(1)空间复杂度内反转单链表的更多相关文章
- 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
先看看这个题目:某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C代码求出这两个单身整数. 要求: 时间复杂度o(n), 空间复杂度o(1). 我们先用最傻瓜的方式来做吧: #inc ...
- 单链表的回文判断(O(n)时间复杂度和O(1)的空间复杂度)
对于单链表来说,判断回文最简单的方法就是遍历链表,将链表中的元素复制到数组中,然后对数组进行判断是否是回文数组,但是这不符合O(1)的空间复杂度. 由于空间复杂度的要求,需要就地操作链表,不能开辟多余 ...
- 数据结构(C语言第2版)----时间复杂度和单链表
马上要到校招了,复习下相关的基础知识. 时间复杂度是什么? 官方解释: 算法的执行时间需要依据算法所编制的程序在计算机上于运行时所消耗的时间来度量.在算法中可以使用基本的语句的执行次数作为算法的时间复 ...
- 删除单链表节点,时间复杂度为O(1)
一个编程练习,删除单链表一个节点,且时间复杂度控制在O(1)内. 1.核心操作代码如下: struct ListNode { int m_data; ListNode *m_pNext; }; voi ...
- 用O(1)的时间复杂度删除单链表中的某个节点
给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- 设置iframe内表单target属性以兼容IE、Firefox【转载】
设置iframe内表单target属性以兼容IE.Firefox[转载] 2011年11月19日 haibor 今天有客户反应,在一产品网站的资源下载页面,用户登录提交后页面无反应! 经测 ...
- 时间复杂度On和空间复杂度O1是什么意思?
(1).把输入规模看成x轴,所花时间/空间看成y轴 O(n)就是y=x,y随x的增长而线性增长.也就是成正比,一条斜线. O(1)就是y=1,是一个常量,不管x怎么变,y不变,一条与x轴平行的线. ( ...
- 反转链表,时间复杂度O(n),空间复杂度O(1)
原理:使用三个指针,p,q指向交换的元素,r指向后续元素 代码如下: class Node{ int data; Node next; Node(int data){ this.data=data; ...
随机推荐
- Linux net core docker hello world 简单使用
安装.net core From 官网 sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft ...
- Node require
var user = require("./module_user");//使用模块 module_userconsole.log(user.userCount);user.use ...
- BFC——块级格式化上下文
BFC(块级格式化上下文) 一.BFC是什么? 从样式上看,具有BFC的容器和普通的容器没有区别.从功能上看,具有BFC的容器可以看作是隔离了的容器,容器里面的元素不会影响到外面的元素,并且BFC具有 ...
- BZOJ4891 TJOI2017龙舟(Polllard-Rho)
对给定模数分解质因数后约分即可.依然常数巨大过不了. #include<iostream> #include<cstdio> #include<cmath> #in ...
- AGC005F Many Easy Problems(NTT)
先只考虑求某个f(k).考虑转换为计算每条边的贡献,也即该边被所选连通块包含的方案数.再考虑转换为计算每条边不被包含的方案数.这仅当所选点都在该边的同一侧.于是可得f(k)=C(n,k)+ΣC(n,k ...
- sakila数据库及其他数据库实例文件
下载地址: https://dev.mysql.com/doc/index-other.html Other MySQL Documentation This page provides additi ...
- Hopcroft-Carp 算法模板 自用
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #d ...
- day11 内置函数
特殊算数运算 计算整数的和 l = [1,2,3,4,5] print(sum(l)) 除法运算,然后取余 在做页面的时候可以根据数据量分页的时候使用 print(divmod(10,3)) # (3 ...
- HTML 浏览器对象 讲解
Window对象 Ø 属性 • Document:文档对象 • Event:事件对象 • History:历史记录对象 • Location:位置对象 • Name:w ...
- HGOI 20190303 题解
/* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...