牛客网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();
}
}