反转链表

来源:互联网 发布: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