0206-reverse-linked-list

leetcode刷題記錄

題目描述:html

206:反轉鏈表數據結構

  • 首先想到的是用棧的數據結構來實現反轉,由於棧的先進後出特色,咱們能夠從頭依次將每一個節點壓人棧內,再一個個彈出構形成一條新的鏈表便可。spa

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
     // 建立一個空棧 Stack
<Integer> s = new Stack<>(); ListNode res = new ListNode(0); ListNode p = head; ListNode q = res;      // 遍歷原鏈表,將節點入棧 while(p != null) { s.push(p.val); p = p.next; }      // 節點出棧,構形成新的鏈表 while(!s.isEmpty()) { q.next = new ListNode(s.pop()); q = q.next; }
     // 返回構造後的鏈表
return res.next; } }
  • 上述方法效率不高,只擊敗了5%的提交記錄,下面是一種更高效的方法。建立一個頭結點,遍歷原來的鏈表,依次將節點掛到新建的頭結點
class Solution {
    public ListNode reverseList(ListNode head) {

     // 建立新的節點 ListNode res
= null; ListNode next = null;
     // p指向頭結點 ListNode p
= head; while(p != null) { next = p.next; p.next = res; res = p; p = next; } return res; } }

此方法時間效率爲O(n),戰勝了100%的提交記錄。3d

參考資料code

本站公眾號
   歡迎關注本站公眾號,獲取更多信息