剑指Offer 面试题24:反转链表 Java代码实现

原创 2017年11月29日 21:51:08

题目:定义一函数,输入链表的头结点,反转该链表并输出反转后的链表头结点。

因为在反转一个节点时,需要把该节点的指针域指向其前一节点,这样就无法访问其后续节点。所以,需要有三个指针分别指向当前节点,前一节点以及后一节点。同样,习惯使用带有头结点的链表结构,第一个数据域为head.next。代码如下:

public static ListNode reversedList(ListNode head){
		//我们使用有头结点的链表结构即第一个数据节点为head.next
		//cur初始指向第一个数据节点,pre初始为空
		ListNode reversedHead=new ListNode();
		ListNode pre=null;
		ListNode cur=head.next;
		
		//当前节点的next为空,说明到尾节点了,只需将head的next指向尾节点即可
		while(cur!=null){
			ListNode next=cur.next;
			if(next==null){
				reversedHead.next=cur;
			}
			
			//倒转节点next域并向后移动一节点位置
			cur.next=pre;
			pre=cur;
			cur=next;
		}
		//返回的仍然是head 不过此时head的next域 是原来链表的尾节点了
		return reversedHead;
	}

测试下效果:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ListNode head=new ListNode();
		ListNode node1=new ListNode();
		ListNode node2=new ListNode();
		ListNode node3=new ListNode();
		
		head.next=node1;
		node1.value=1;
		node1.next=node2;
		node2.value=2;
		node2.next=node3;
		node3.value=3;
		ListNode.printStr(head);
		
		ListNode reversedHead=reversedList(head);
		ListNode.printStr(reversedHead);
		ListNode.printStr(reversedList(new ListNode()));
	}


其中printStr是ListNode中定义的静态方法,简单输出链表数据:

public static void printStr(ListNode head) {
		if (head == null)
			return;
		ListNode pNode = head.next;
		while (pNode != null) {
			if(pNode.next==null){
				System.out.print(pNode.value);
				System.out.println();
				pNode = pNode.next;
			}else{
				System.out.print(pNode.value);
				System.out.print("->");
				pNode = pNode.next;
			}
		}
	}
}

输出如下:

1->2->3
3->2->1

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java 反转链表的两种方法

目录目录 链表节点的数据结构 方法一遍历 方法二递归链表节点的数据结构 链表的数据结构主要是由两部分组成的,显而易见,一个就是当前的节点存储的数据,一个就是指向下一个节点。 /** * 链表的节点 ...
  • caialun
  • caialun
  • 2016年12月17日 13:24
  • 231

剑指Offer:面试题16——反转链表(java实现)

问题描述 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。链表结点如下: public class ListNode { int val; ListNod...
  • lilianforever
  • lilianforever
  • 2016年07月06日 15:52
  • 1532

经典面试题:单链条反转的递归与非递归方法及分析[Java]

关于单链表反转问题的算法设计和分析。 以及对JAVA为什么没有指针的一点解释。...
  • Shenpibaipao
  • Shenpibaipao
  • 2017年05月23日 22:58
  • 205

Java单链表反转 详细过程

Java单链表反转 Java实现单链表翻转 使用递归法实现单链表反转,使用遍历反转法:递归反转法是从后往前逆序反转指针域的指向,而遍历反转法是从前往后反转各个结点的指针域的指向。     【尊重原创,...
  • guyuealian
  • guyuealian
  • 2016年04月11日 10:36
  • 30817

【LeetCode-面试算法经典-Java实现】【206-Reverse Linked List(反转一个单链表)】

【206-Reverse Linked List(反转一个单链表)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月27日 06:35
  • 3600

剑指offer_面试题16_反转链表(两种方法)

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 在解决问题前,先想好测试用例: 1、功能测试:输入的链表含有多个结点,链表中只有一个结点 2、特殊输入测试:头结点...
  • jwentao01
  • jwentao01
  • 2015年08月10日 11:00
  • 2043

剑指offer--面试题16:翻转链表--Java实现

题目描述: 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。解题思路: 为了反转列表,其实就是为了改变next指针,由指向后一个变为指向前一个。 这里为了避免链表断裂,要...
  • u012289407
  • u012289407
  • 2015年06月15日 21:36
  • 1059

链表、反转链表操作,Java实现

线性表,常用的数据结构之一。 链表,链式线性表,以链接的方式构建线性表。 还有一种,是用连续的储存空间的方式(如,数组)构建线性表。Java的api中虽有现成的实现类供使用。基于熟悉链表目的,用J...
  • user020
  • user020
  • 2015年05月15日 20:43
  • 366

JAVA实现链表面试题

这篇文章主要介绍了JAVA相关实现链表的面试题,代码实现非常详细,每一个方法讲解也很到位,特别适合参加Java面试的朋友阅读。 这份笔记整理了整整一个星期,每一行代码都是自己默写完成,并测试...
  • u010442302
  • u010442302
  • 2016年07月08日 22:02
  • 2125

剑指Offer面试题16(Java版):反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多的面试官喜欢出链表相关的问题,就是想通过指...
  • jsqfengbao
  • jsqfengbao
  • 2015年08月01日 16:45
  • 1416
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer 面试题24:反转链表 Java代码实现
举报原因:
原因补充:

(最多只允许输入30个字)