题目:将一个有链表头的单向单链表逆序

分析:

  1. 链表为空或只有一个元素直接返回;
  2. 设置两个前后相邻的指针p,q,使得p指向的节点为q指向的节点的后继;
  3. 重复步骤2,直到q为空;
  4. 调整链表头和链表尾;

图解:

  以链表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实现)的更多相关文章

  1. 链表逆序,java实现

    package com.cskaoyan.linkedlist; //反转数组 public class LinkedListDemo2 { public static Node reverse(No ...

  2. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  3. ZT 链表逆序

    链表逆序 原帖地址http://blog.csdn.net/niuer09/article/details/5961004 分类: C/C++2010-10-23 17:23 18425人阅读 评论( ...

  4. C# 单向链表 逆序(递归)

    static void Main(string[] args) { while (true) { LinkedList L = new LinkedList(); L.Add(new Node(&qu ...

  5. 链表逆序---python

    class ListNode: Value = '' # 节点要储存的值,因为Python是弱类型,因此无需传入泛型 Next = None # 下一个节点,初始化时为空值 def __init__( ...

  6. 【云栖社区001-数据结构】如何实现一个高效的单向链表逆序输出(Java版)

    如题 动手之前,发现自己很擅长用C语言来写链表. 不过,既然自己做的是Java开发,那么还是用Java实现这个算法吧:毕竟,以后的若干年里都差不多要跟Java打交道了. 于是,先将Java版的链表自学 ...

  7. 剑指Offer03 逆序输出链表&链表逆序

    多写了个逆序链表 /************************************************************************* > File Name: ...

  8. 基于visual Studio2013解决面试题之0504单链表逆序

     题目

  9. C语言两个升序递增链表逆序合并为一个降序递减链表,并去除重复元素

    #include"stdafx.h" #include<stdlib.h> #define LEN sizeof(struct student) struct stud ...

随机推荐

  1. linux sort命令学习

    linux sort命令以行为单位对文本文件进行排序. 接下来我们会以/tmp/sort_test.txt这个文本文件为例对sort命令的用法进行说明. sh-# cat /tmp/sort_test ...

  2. C# 反编译-Reflector 反混淆-De4Dot 修改dll/exe代码-reflexil

    反编译工具 Reflector 破解版下载地址:http://pan.baidu.com/s/15UwJo 使用方法:略 反混淆工具De4Dot 开源软件 下载地址http://pan.baidu.c ...

  3. 函数xdes_calc_descriptor_page

    根据偏移量计算出第几个xdes page 0 %16328 = 0 64% 16328 = 64 128 % 16328 = 128 192 % 16328 = 192 /************** ...

  4. bzoj2005: [Noi2010]能量采集

    lsj师兄的题解 一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) *  2 - 1. 设g(i)为 gcd(x, y) = i ( 1 < ...

  5. Qt 多线程学习

    最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ GUI Qt4 编程>来学习. 这本书的第14章是关于多线程的知识,使用的Qt版本是Qt4.x.在下用的是最新 ...

  6. AspNet WebApi OData 学习

    OData介绍:是一个查询和更新数据的Web协议.OData应用了web技术如HTTP.Atom发布协议(AtomPub)和JSON等来提供对不同应用程序,服务 和存储的信息访问.除了提供一些基本的操 ...

  7. OpenGL 顶点缓存对象

    顶点缓存对象(Vertex Buffer Object,简称 VBO),允许开发者根据情况把顶点数据放到显存中. 如果不用 VBO,用 glVertexPointer / glNormalPointe ...

  8. 【C#学习笔记】获得系统时间

    using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { Conso ...

  9. Eclipse小技巧<一>

    Eclipse是一款特别好用的开源开发工具,基于插件的特性使其能够进行各种语言的开发.非常喜欢eclipse里的编码风格,感觉这个开发工具十分灵活,又有很多开发的小技巧能够提高开发效率,每次学到一个t ...

  10. 不重启mysql情况修改参数变量

    地球人都知道,更新mysql配置my.cnf需要重启mysql才能生效,但是有些时候mysql在线上,不一定允许你重启,这时候应该怎么办呢? 看一个例子: 1 2 3 4 5 6 7 8 9 10 m ...