题意描述:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
限制: 0 <= 节点个数 <= 5000
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解题思路:
Alice: 这题做过啊。
Bob: 对啊,可以参考 这个链接 的文章。
代码:
Java 平淡无奇方法一:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}else if(head.next.next == null){
ListNode tmp = head.next;
head.next.next = head;
head.next = null;
return tmp;
}else{
ListNode one = head;
ListNode two = head.next;
ListNode thr = head.next.next;
head.next = null;
while(thr != null){
two.next = one;
one = two;
two = thr;
thr = thr.next;
}
two.next = one;
return two;
}
}
}
Java 方法二:又快又好是递归,有时候就是拼手速呀。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
// 处理特殊情况 以及 递归边界
return head;
}else{
ListNode ret = reverseList(head.next);
head.next.next = head;
// 形成反向的指向关系
head.next = null;
// 去除原来的指向关系
return ret;
// 一路返回尾结点
}
}
}
易错点:
- 输入:
[]
[1]
[1,2]
[1,2,3]
[1,2,3,4,5]
- 输出:
[]
[1]
[2,1]
[3,2,1]
[5,4,3,2,1]
总结: