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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值