单链表反转java代码

据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码。

1,先定义一个节点类。

1 public class Node {
2     int index;
3     Node next;
4
5     public Node(int index, Node next) {
6       this.index = index;
7       this.next = next;
8     }
9   }

2,我一共写了三种方法

(1)迭代法。先将下一节点纪录下来,然后让当前节点指向上一节点,再将当前节点纪录下来,再让下一节点变为当前节点

public Node reverse(Node node) {
    Node prev = null;
    Node now = node;
    while (now != null) {
      Node next = now.next;
      now.next = prev;
      prev = now;
      now = next;
    }

    return prev;
  }

(2)递归方法1。先找到最后一个节点,然后从最后一个开始反转,然后当前节点反转时其后面的节点已经进行反转了,不需要管。最后返回原来的最后一个节点

  

public Node reverse2(Node node, Node prev) {
    if (node.next == null) {
      node.next = prev;
      return node;
    } else {
      Node re = reverse2(node.next, node);
      node.next = prev;
      return re;
    }
}

(3)递归方法2。先找到最后一个节点,然后从最后一个节点之前的那个节点的方法体中开始将下一个指向当前一个,然后当前节点反转时其后面的节点已经进行反转了,不需要管。最后返回原来的最后一个节点。

public Node reverse3(Node node) {
    if(node.next==null)return node;
    Node next = node.next;
    node.next = null;
    Node re = reverse3(next);
    next.next = node;
    return re;
  }

总结:迭代法思路很清晰,就是将当前节点和下一节点保存起来,然后将当前节点反转;递归法1是先找到最后一个节点进行反转,然后再反转之前的节点时就不用担心丢失以后的节点了,只需要关心本节点的反转;递归法2是同理,只是反转动作是从最后一个节点的前一个节点开始的。另外这几个方法都没有考虑首节点为null的情况,切记。

 
时间: 2024-08-13 22:26:14

单链表反转java代码的相关文章

单链表反转(Singly Linked Lists in Java)

单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法 Java代码   package dsa.linkedlist; public class Node<E>{ E data; Node<E> next; } Java代码   package dsa.linkedlist; public class ReverseLinkedListRecursively { public static void main(String args[])

Java实现单链表反转

本文主要介绍单链表反转的两种方法,记录如下: 1. package com.leetcode; public class ListReverse { public static void main(String[] args) { Node node1 = new Node(1); Node node2 = new Node(2); Node node3 = new Node(3); Node node4 = new Node(4); node1.next = node2; node2.next

单链表反转C语言实现

单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: # include <iostream> # include <cstdlib> using namespace std; struct linkNode { int val; linkNode *next; linkNode(int x):val(x),next(NULL){} }; linkNod

单链表反转python实现

单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class ListNode: def __init__(self,x): self.val=x; self.next=None; def nonrecurse(head): #循环的方法反转链表 if head is None or head.next is None: return head; pre=None; c

单链表反转总结篇

单链表反转总结篇 转自https://www.cnblogs.com/byrhuangqiang/p/4311336.html 单链表的反转是常见的面试题目.本文总结了2种方法. 1 定义 单链表node的数据结构定义如下: class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } } 2 方法1:就地反转法 2.1 思路 把当前链表的下一个节点pCur插入到头结点dummy的下一个节点中

图解单链表反转

仅一家之言,望多交流,如有错漏,还请指教! 另,做图不易,转发请注明出处 https://www.cnblogs.com/luego/p/11421590.html 本文有要以图的方式,来呈现链表反转推演的具体过程,以助于理解,保持思路的清晰. 主要采用两种方法实现单链表反转: (1)通过循环,通过三个指针对链表进行遍历,并逐个反转: (2)使用递归的方法进行反转.  1. 循环反转 废话不多说,先上图: 操作过程: ① 初始化pNext至当前节点的下一个节点,为断链做准备② 判断下一个节点是否

单链表反转问题

单链表反转问题 基本问题 如何将单链表反转? 算法实现 /** * * Description: 单链表反转. * * @param head * @return ListNode */ public static ListNode reverseList(ListNode head) { if (head == null) { return head; } ListNode prev = null; ListNode current = head; ListNode next = null;

单链表反转的2种方法

1 public class ReverseDemo { 2 3 /** 4 * 单链表反转的两种方法 5 */ 6 public static void main(String[] args) { 7 Node head =new Node("a"); 8 Node node2=new Node("b"); 9 Node node3=new Node("c"); 10 head.setNext(node2); 11 node2.setNext(

链表 单链表反转

思路1:O(n^2). “狸猫换太子”,不进行改动链表结构,只首尾交换len/2次.但是在本函数中用到了定位函数,定位函数实际上是遍历了一遍整个链表,所以综合效率很低,达到O(n^2). //单链表反转(O(n^2)) void reverseList(Node* Head) { int count = numOfNodes(Head); //首尾交换 for(int i=1; i<=count/2; i++) { Node* p1 = locateNodeI(Head, i); Node* p