单链表反转(Singly Linked Lists in Java)
- package dsa.linkedlist;
- public class Node<E>{
- E data;
- Node<E> next;
- }
- package dsa.linkedlist;
- public class ReverseLinkedListRecursively {
- public static void main(String args[]) {
- ReverseLinkedListRecursively reverser = new ReverseLinkedListRecursively();
- SinglyLinkedList<Integer> originalList = reverser.getLabRatList(10);
- System.out.println("Original List : " + originalList.toString());
- originalList.start = reverser.reverse(originalList.start);
- System.out.println("Reversed List : " + originalList.toString());
- }
- public Node<Integer> reverse(Node<Integer> list) {
- if (list == null || list.next == null)
- return list;
- Node<Integer> nextItem = list.next;
- list.next = null;
- Node<Integer> reverseRest = reverse(nextItem);
- nextItem.next = list;
- return reverseRest;
- }
- private SinglyLinkedList<Integer> getLabRatList(int count) {
- SinglyLinkedList<Integer> sampleList = new SinglyLinkedList<Integer>();
- for (int i = 0; i < count; i++) {
- sampleList.add(i);
- }
- return sampleList;
- }
- }
- /*
- * SAMPLE OUTPUT Original List : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Reversed List : 9,
- * 8, 7, 6, 5, 4, 3, 2, 1, 0
- */
- package dsa.linkedlist;
- /**
- * This is a singly linked list with no prev pointer.
- * @author Braga
- * @param <E>
- */
- public class SinglyLinkedList<E> {
- Node<E> start;
- int size;
- public SinglyLinkedList(){
- start = null;
- size = 0;
- }
- //insertAtLast
- public void add(E data){
- insertAtLast(data);
- }
- public void insertAtLast(E data){
- if(size==0){
- start = new Node<E>();
- start.next = null;
- start.data = data;
- }else{
- Node<E> currentNode = getNodeAt(size-1);
- Node<E> newNode = new Node<E>();
- newNode.data = data;
- newNode.next = null;
- currentNode.next = newNode;
- }
- size++;
- }
- public void insertAtFirst(E data){
- if(size==0){
- start = new Node<E>();
- start.next = null;
- start.data = data;
- }else{
- Node<E> newNode = new Node<E>();
- newNode.data = data;
- newNode.next = start;
- start = newNode;
- }
- size++;
- }
- public Node<E> getNodeAt(int nodePos) throws ArrayIndexOutOfBoundsException{
- if(nodePos>=size || nodePos<0){
- throw new ArrayIndexOutOfBoundsException();
- }
- Node<E> temp = start;//Move pointer to front
- int counter = 0;
- for(;counter<nodePos;counter++){
- temp = temp.next;
- }
- return temp;
- }
- public void insertAt(int position, E data){
- if(position == 0){
- insertAtFirst(data);
- }else if(position==size-1){
- insertAtLast(data);
- }else{
- Node<E> tempNode = getNodeAt(position-1);
- Node<E> newNode = new Node<E>();
- newNode.data = data;
- newNode.next = tempNode.next;
- tempNode.next = newNode;
- size++;
- }
- }
- public Node<E> getFirst(){
- return getNodeAt(0);
- }
- public Node<E> getLast(){
- return getNodeAt(size-1);
- }
- public E removeAtFirst(){
- if(size==0){
- throw new ArrayIndexOutOfBoundsException();
- }
- E data = start.data;
- start = start.next;
- size--;
- return data;
- }
- public E removeAtLast(){
- if(size==0){
- throw new ArrayIndexOutOfBoundsException();
- }
- Node<E> tempNode = getNodeAt(size-2);
- E data = tempNode.next.data;
- tempNode.next = null;
- size--;
- return data;
- }
- public E removeAt(int position){
- if(position==0){
- return removeAtFirst();
- }else if(position == size-1){
- return removeAtLast();
- }else{
- Node<E> tempNode = getNodeAt(position-1);
- E data = tempNode.next.data;
- tempNode.next = tempNode.next.next;
- size--;
- return data;
- }
- }
- public int size(){
- return size;
- }
- public String toString(){
- if(size==0){
- return "";
- }else{
- StringBuilder output = new StringBuilder();
- Node<E> tempNode = start;
- while(tempNode.next!=null){
- output.append(tempNode.data).append(", ");
- tempNode = tempNode.next;
- }
- output.append(tempNode.data);
- return output.toString();
- }
- }
- }
单链表反转(Singly Linked Lists in Java)的更多相关文章
- 数据结构——单链表(singly linked list)
/* singlyLinkedList.c */ /* 单链表 */ /* 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. */ #include <stdio ...
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- Java实现单链表反转操作
单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据.二是指针域,用于存储下一个节点的地址.在Java中定义如下: public class ...
- java 单链表反转
最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...
- Java单链表反转图文详解
Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...
- java实现单链表反转(倒置)
据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. 1 public class Node { 2 int index; ...
- 单链表反转java代码
据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. public class Node { int index; Nod ...
- java单链表反转
今天做leetcode,遇到了单链表反转.研究了半天还搞的不是太懂,先做个笔记吧 参考:http://blog.csdn.net/guyuealian/article/details/51119499 ...
- C++单链表反转
单链表反转笔记: #include<iostream> #include<string.h> using namespace std; struct ListNode { in ...
随机推荐
- UNIX网络编程——非阻塞connect
当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三次握手继续进行.我们接着使用select检测这个连接或成功或失败的已建 ...
- 【一天一道LeetCode】#326. Power of Three
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- CSS 控制table 滑动及调整列宽等问题总结
一. 通过css控制table y方向上滚动 html中没有滚动条,可以根据overflow属性的scroll来对table显示不完全的内容进行滚动. 只是y方向上滚动,很简单,只要设置div的hei ...
- 深入浅出EF之ModelFirst和DBFirst
在上篇博文中,小编主要简单的介绍了一下EF的一些基础知识,其中,小编蜻蜓点水的提了一下ModelFirst和DBFirst,ModelFirst先设计实体,然后根据模型生成数据库,DBFirst根据数 ...
- UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)
一.使用互斥锁 1.初始化互斥量 pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量 int pthread_mutex_init( ...
- RabbitMQ消息队列(五):Routing 消息路由
上篇文章中,我们构建了一个简单的日志系统.接下来,我们将丰富它:能够使用不同的severity来监听不同等级的log.比如我们希望只有error的log才保存到磁盘上. 1. Bindings ...
- FORM中的MOAC控制
1.创建表时,对_ALL表创建同义词 -- Create Multi Org Synonym CREATE OR REPLACE SYNONYM CUX_WF_DEF_HEADER FOR CUX ...
- 分布式进阶(五)之JSVC配置
应用场景:在linux系统上进行项目开发,在部署java项目时,常用方法就是写一个shell脚本,但当服务器重启了,经常会忘了启动shell脚本了.所以我们需要把自己的应用变成linux的服务,当服务 ...
- Red Hat Enterprise Linux 5 64-bit chinese language support config steps
Red Hat Enterprise Linux 5 64-bit 系统下安装中文语言支持方法 测试环境:Windows2012+Vmvare9.0+Red Hat Enterprise Linux ...
- 调用sed命令的三种方式
调用sed命令的三种方式 调用sed有三种方式,一种为Shell命令行方式,另外两种是将sed命令写入脚本文件,然后执行该脚本文件. 三种方式的命令格式归纳如下: 一.在Shell命令行输入命令调用s ...