链表逆序(JAVA实现)
题目:将一个有链表头的单向单链表逆序
分析:
- 链表为空或只有一个元素直接返回;
- 设置两个前后相邻的指针p,q,使得p指向的节点为q指向的节点的后继;
- 重复步骤2,直到q为空;
- 调整链表头和链表尾;
图解:
以链表A->B->C->D为例,逆序此链表。
0.初始状态 1.2.3 循环部分
p = head->next; while(q!=null){
q = head->next->next; t = q->next;
t = null; q->next = p;
p = q;
q = t;
}
0.初始状态

1.第一次循环

2.第二次循环

3.第三次循环

4.q==null循环结束
head->next->next = null;//设置链表尾
head-next = p;//修改链表头

实现及测试代码
节点Node类:
package linkList.reverse; /**
* 链表节点
* @author Administrator
*
*/
public class Node {
private Integer data;//节点数据域
private Node next;//节点指针域
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
逆序方法:
/**
*
* @param node 原始链表头节点
* @return 逆序后链表头节点
*/
Node reverseList(Node head){
//如果链表为空或只有一个元素直接返回
if(head.getNext()==null||head.getNext().getNext()==null){
return head;
}
Node p = head.getNext();
Node q = head.getNext().getNext();
Node t = null;
while(q!=null){
t = q.getNext();
q.setNext(p);
p = q;
q = t;
}
//设置链表尾
head.getNext().setNext(null);
//修改链表头
head.setNext(p);
return head;
}
测试代码:
//表头
Node head = new Node();
head.setData(-1);
head.setNext(null); //定义指针
Node p; p = head; //初始化链表数据[1~10]
for(int i=1;i<=10;i++){
Node q = new Node();
q.setData(i);
q.setNext(null);
p.setNext(q);
p = q;
} //输出原始链表
printList(head); System.out.println(""); //输出逆序后的链表
printList(reverseList(head));
链表逆序(JAVA实现)的更多相关文章
- 链表逆序,java实现
package com.cskaoyan.linkedlist; //反转数组 public class LinkedListDemo2 { public static Node reverse(No ...
- Reverse Linked List II 单向链表逆序(部分逆序)
0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...
- ZT 链表逆序
链表逆序 原帖地址http://blog.csdn.net/niuer09/article/details/5961004 分类: C/C++2010-10-23 17:23 18425人阅读 评论( ...
- C# 单向链表 逆序(递归)
static void Main(string[] args) { while (true) { LinkedList L = new LinkedList(); L.Add(new Node(&qu ...
- 链表逆序---python
class ListNode: Value = '' # 节点要储存的值,因为Python是弱类型,因此无需传入泛型 Next = None # 下一个节点,初始化时为空值 def __init__( ...
- 【云栖社区001-数据结构】如何实现一个高效的单向链表逆序输出(Java版)
如题 动手之前,发现自己很擅长用C语言来写链表. 不过,既然自己做的是Java开发,那么还是用Java实现这个算法吧:毕竟,以后的若干年里都差不多要跟Java打交道了. 于是,先将Java版的链表自学 ...
- 剑指Offer03 逆序输出链表&链表逆序
多写了个逆序链表 /************************************************************************* > File Name: ...
- 基于visual Studio2013解决面试题之0504单链表逆序
题目
- C语言两个升序递增链表逆序合并为一个降序递减链表,并去除重复元素
#include"stdafx.h" #include<stdlib.h> #define LEN sizeof(struct student) struct stud ...
随机推荐
- Socket programming in C on Linux | tutorial
TCP/IP socket programming This is a quick guide/tutorial to learning socket programming in C languag ...
- Android权限安全(13)4.3前后root原理不同
在JB MR2(4.3)之前 Apk内部可以通过Java的Runtime执行一个具有Root-setUID的可执行文件而 提升Effective UID来完成一些特权操作,典型的Root包中的su就是 ...
- Linux文件与进程的Capability简介
UID这种权限机制颗粒太粗,容易引起权利过剩(溢出),Linux引入了Capability:每个Capability系统内以一位Bit代表,OS内部使用64bit存储. 下面是android的capa ...
- 【转载】Java中如何写一段内存泄露的程序 & ThreadLocal 介绍和使用
可以参考这段文章: link A1:通过以下步骤可以很容易产生内存泄露(程序代码不能访问到某些对象,但是它们仍然保存在内存中): 上文中提到了使用ThreadLocal造成了内存泄露,但是写的不清不楚 ...
- uva12169 Disgruntled Judge
扩展欧几里得. 枚举a,根据x1,x3和递推式可得. (a+1)*b-k*mod=f[3]-a*a*b. 通过扩展欧几里得求出b. 带入原式进行计算. #include<cstdio> # ...
- OpenSSL再爆多处高危漏洞
OpenSSL团队于北京时间6月5号晚8点左右发布了5个安全补丁,这次的更新涉及多处高危漏洞,连接:http://www.openssl.org/news/ 受影响的版本包括: OpenSSL 1.0 ...
- jquery仿邮箱文本输入框自动加载邮箱后缀
在像百度这样的网站注册时,你会看到输入邮箱会出现自动给用户输入补全主流邮箱.这种对于增加用户体验的小例子已司空见惯.正好看到人家写的这种js功能.还挺不错,使用起来很方便,几乎不用写神呢代码.&quo ...
- 锋利的jQuery读书笔记---jQuery中操作DOM
一般来说,DOM的操作分为3个方面,即DOM Core.HTML-DOM和CSS-DOM jQuery中的DOM操作主要包括以下种类: 查找节点 查找元素节点 查找属性节点 创建节点 创建元素节点 创 ...
- MySQL5.6 replication architecture --原图来自姜承尧
- hdu 3948(后缀数组+RMQ)
题意:求一个串中有多少不同的回文串. 分析:这一题的关键是如何去重,我表示我现在还没理解为什么这样去重,先放这里过两天再看!! //不同回文子串数目 #include <iostream> ...