反转链表
来源:互联网 发布:dnf每隔几分钟网络中断 编辑:程序博客网 时间:2024/06/04 20:15
牛客网AC地址:http://www.nowcoder.com/books/coding-interviews/75e878df47f24fdc9dc3e400ec6058ca?rp=1
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
链表的节点定义如下:
public class ListNode {int val; ListNode next = null; ListNode(int val) { this.val = val; }}
思路:
需要调整链表中指针的方向,试想,把指针指到它的前面的节点的时候,原来指针指向的节点不能丢掉,所以需要将这个节点(当前遍历的下一个节点)保存下来;
再想,当遍历一个节点并且变换了指针的方向的时候,到遍历到下一个节点的时候,该指向哪一个节点了呢?所以前一个遍历的节点和当前这个节点本身也需要保存下来。
最后,当遍历到尾节点的时候,即遍历到的当前节点的next为null,此时就是到了反转链表的头结点了。
AC代码:
public class Solution {public ListNode ReverseList(ListNode head) {ListNode reversedHead = null;ListNode nodeNow = head; // 当前遍历的节点ListNode prev = null; // 前一个节点while (nodeNow != null) {ListNode next = nodeNow.next; // 下一个节点if (next == null) { // 遍历到最后一个节点了reversedHead = nodeNow;}nodeNow.next = prev;prev = nodeNow; // 下一次遍历的时候prev和nodeNow都变化了nodeNow = next;}return reversedHead;}}
测试代码:
public class Main {public static void main(String[] args) {ListNode list = null;ListNode node_1 = new ListNode(1);ListNode node_2 = new ListNode(3);ListNode node_3 = new ListNode(5);list = node_1;list.next = node_2;list.next.next = node_3;Solution testSolution = new Solution();ListNode reverseList = testSolution.ReverseList(list);Main.printList(reverseList);}public static void printList(ListNode list) {while (list != null) {System.out.print(list.val);list = list.next;}System.out.println();}}
0 0
- 链表反转
- 反转链表
- 单向链表反转
- 链表反转:
- 链表的反转
- 链表反转
- 反转单向链表
- 链表反转
- 单向链表反转
- 单向链表反转
- 链表的反转
- 链表反转
- 反转链表
- 链表反转
- 链表反转
- 链表反转
- 链表反转
- 链表的反转
- win7+ubuntu双系统安装
- centos-6.6上安装 redis-3.0.2
- Redis数据结构分析
- 【4.17】建立一个对象数组,内放6个学生的数据(学号、成绩),用指针指向数组首元素,输出第2,4,6个学生的数剧。
- 在html中引用*.js文件
- 反转链表
- 倒计时的做法
- linux shell 指令 诸如-d, -f, -e之类的判断表达式
- JDBC高级特性(三)分布式事务和JTA基本原理
- 看不懂,悲剧
- 黑马程序员——Java基础组成
- 《统计学习方法》笔记(四)--k近邻法
- 用Pandas完成Excel中常见的任务(2)
- java Session管理