博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer面试题16:反转链表
阅读量:4974 次
发布时间:2019-06-12

本文共 2093 字,大约阅读时间需要 6 分钟。

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

解题思路:单向链表只能实现单向遍历,改变链表方向就是要把当前链表的节点指向它的前一个节点,
一旦当前链表指向发生了变化,就不能根据此节点获取到它后面的节点,所以在改变方向前要保存当前节点的下一节点,防止链表断开,
因此需要三个指针来保存当前节点,当前节点的前节点,当前节点的下节点。

注意:如果当前节点没有下一节点,则此节点就是反转后的链表的头结点。

另外一种解决办法是使用一个栈结构,顺序遍历链表,把每个节点依次入栈。待全部节点入栈后,依次把节点从栈中取出并连接,这样得到的链表也是反转后的链表。

1 package Solution; 2  3  4 public class No16ReverseList { 5  6     public static class ListNode { 7         int data; 8         ListNode next; 9 10         public ListNode() {11 12         }13 14         public ListNode(int value, ListNode next) {15             this.data = value;16             this.next = next;17         }18     }19 20     public static ListNode reverseList(ListNode head) {21         if (head == null)22             throw new RuntimeException("invalid List,can't be null");23         if (head.next == null)24             return head;25         ListNode reversedHead = null;26         ListNode node = head;27         ListNode preNode = null;28         while (node != null) {29             ListNode nextNode = node.next;30             if (nextNode == null)31                 reversedHead = node;32             // 赋值顺序不能变33             node.next = preNode;34             preNode = node;35             node = nextNode;36         }37         return reversedHead;38     }39 40     public static void print(ListNode head) {41         if (head == null)42             System.out.println("当前链表为空");43         while (head != null) {44             System.out.print(head.data + ",");45             head = head.next;46         }47     }48 49     public static void main(String[] args) {50         ListNode node1 = new ListNode(4, null);51         ListNode node2 = new ListNode(3, node1);52         ListNode node3 = new ListNode(2, node2);53         ListNode node4 = new ListNode(1, node3);54 55         print(reverseList(node4));56         System.out.println();57         print(reverseList(new ListNode(5, null)));58         System.out.println();59         print(reverseList(new ListNode()));60         System.out.println();61     }62 63 }

 

转载于:https://www.cnblogs.com/gl-developer/p/7237178.html

你可能感兴趣的文章
SignalR循序渐进(一)简单的聊天程序
查看>>
MyServer
查看>>
Learning Cocos2d-x for XNA(2)——深入剖析Hello World
查看>>
软件建模——第9章 毕业论文管理系统—面向对象方法
查看>>
Http协议
查看>>
[SDOI2008]洞穴勘测
查看>>
NOI2014 购票
查看>>
Difference between Linearizability and Serializability
查看>>
电影《绿皮书》
查看>>
IDEA使用操作文档
查看>>
如何对网课、游戏直播等进行录屏
查看>>
UIView
查看>>
添加日期选择控件
查看>>
jquery.cookie.js操作cookie
查看>>
javascript遍历数组
查看>>
bzoj4765: 普通计算姬 (分块 && BIT)
查看>>
thinkphp5-----模板中函数的使用
查看>>
POJ-3211 Washing Clothes[01背包问题]
查看>>
[BZOJ4832][Lydsy1704月赛]抵制克苏恩
查看>>
数据库三范式
查看>>