hh_zheng的博客

一次只做一件事,并做好它!

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

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

因为在反转一个节点时,需要把该节点的指针域指向其前一节点,这样就无法访问其后续节点。所以,需要有三个指针分别指向当前节点,前一节点以及后一节点。同样,习惯使用带有头结点的链表结构,第一个数据域为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

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hh_zheng/article/details/78670332
个人分类: 剑指offer_Java实现
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭