1.题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
2. 自己的常规解法:
/**
* 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;
}
ListNode pos = null;
ListNode lastNode = null;
lastNode = head;
pos = head.next;
head.next = null;
head = pos;
while(head.next != null){
pos = head.next;
head.next = lastNode;
lastNode = head;
head = pos;
}
head.next = lastNode;
return head;
}
}
2.1 eclipse 完整可调试代码:
package single_100;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* TODO : 创建一个 链表,翻转链表
* @author Infosec_jy
*
*/
public class ReverseList_206 {
public static void main(String[] args) {
int[] vals = new int[]{1,2,3,4,5};
ListNode head = new ListNode(vals[0]);
ListNode pos = head;
for(int i = 1;i < vals.length; i++){
pos.next = new ListNode(vals[i]);
pos = pos.next;
}
// ListNode head = null; 考虑 head 为 null
// ListNode head = new ListNode(6); 考虑 head.next 为 null
ListNode result = reverseList(head);
while(head.next != null){
System.out.print(head.val);
head = head.next;
}
System.out.print(head.val);
}
public static ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode pos = null;
ListNode lastNode = null;
lastNode = head;
pos = head.next;
head.next = null;
head = pos;
while(head.next != null){
pos = head.next;
head.next = lastNode;
lastNode = head;
head = pos;
}
head.next = lastNode;
return head;
}
}
3. 性能评级:
4. 思考过程:
第一次 有考虑 存储到 stringBuffer中,再转为 int[] 数组,实现。感觉会比较消耗空间,想法作废。
现在用 递归 做,感觉 不复杂,为什么 性能差这么多呢。 要考虑。
5. 后期优化:
大神的解法:
public static ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
ListNode next;
while(cur != null){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
性能:
思考: 尽量不定义多余变量,尽量定义 局部变量。争取每个变量 都有其特殊且简单的意义。