剑指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

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

剑指Offer 面试题23:链表中环的入口节点 Java代码实现

题目描述 一个链表中包含环,请找出该链表的环的入口结点。 这题又用到了一快一慢两个指针的方法,快指针一次走两步慢指针一次走一步。可以证明,若存在环路,则这两个指针一定会在环路中某个地方相遇。这也是检...

剑指Offer 面试题22:链表中倒数第k个节点 Java代码实现

题目 输入一个链表,输出该链表中倒数第k个结点。 这个问题可以用两个链表指针来实现,这个方法在单向链表的问题中经常使用。具体而言,就是一快一慢两个指针,快指针先走(k-1)步,然后两个指针同时走,当...

剑指offer面试题11 数值的整数次方的Java代码实现

数值的整数次方的Java代码实现 剑指offer这本书不错。以下是我对这道题的Java代码实现 /** * 剑指offer中面试题11:数值的整数次方double power(double b...

剑指Offer 面试题15:二进制中1的个数 Java代码实现

剑指Offer 面试题15:二进制中1的个数 题目:实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,9的二进制是1001,有两位是1,那么输入9,函数输出2。 看完题目我就想到了J...

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

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多的面试官喜欢出链表相关的问题,就是想通过指...

剑指offer-面试题 16:反转链表

面试题 16:反转链表 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。...
  • pomony1
  • pomony1
  • 2017年04月17日 21:07
  • 252

剑指offer之面试题16:反转链表

题目描述输入一个链表,反转链表后,输出链表的所有元素。思路:借助图形来分析一下反转链表需要改变哪些指针。假设某一时刻,经过若干操作,我们已经把h点之前的指针调整完毕,现在反转i指针指向的结点。 由图...

剑指offer--面试题16: 反转链表

 题目描述 输入一个链表,反转链表后,输出链表的所有元素。 python实现: # -*- coding:utf-8 -*- # class ListNode: #     def __i...

剑指offer-面试题16:反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 思路:如果全部改变指针指向,则可以反转链表,那么对当前结点,要指向它前面的结点,同时它的下一节点要在下一步中指向自己,所...

【剑指Offer学习】【面试题16 :反转链表】

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer 面试题24:反转链表 Java代码实现
举报原因:
原因补充:

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