摘要:先跳過前個節點,然后初始化好這五個指針后,用中的方法反轉鏈表。完成了第個節點的反轉后,將子鏈反轉前的頭節點的設為子鏈反轉過程中的下一個節點,將子鏈反轉前頭節點前面一個節點的設為子鏈反轉過程中的當前節點。
Reverse Linked List I
遞歸法 復雜度Reverse a singly linked list.
click to show more hints.
Hint: A linked list can be reversed either iteratively or recursively. Could you implement both?
時間 O(N) 空間 O(N) 遞歸棧空間
思路基本遞歸
代碼public class Solution { ListNode newHead; public ListNode reverseList(ListNode head) { reverse(head); return newHead; } private ListNode reverse(ListNode n){ if( n == null || n.next == null){ newHead = n; } else { ListNode prev = reverseList(n.next); prev.next = n; } return n; } }迭代法 復雜度
時間 O(N) 空間 O(1)
思路基本迭代
代碼java
public class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.next == null) return head; ListNode p1 = head; ListNode p2 = p1.next; while(p2 != null){ ListNode tmp = p2.next; p2.next = p1; p1 = p2; p2 = tmp; } head.next = null; return p1; } }
python
class Solution(object): def reverseList(self, head): """ :type head: ListNode :rtype: ListNode """ p1 = None p2 = head while(p2 is not None): tmp = p2.next p2.next = p1 p1 = p2 p2 = tmp return p1Reverse Linked List II
迭代法 復雜度Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
時間 O(N) 空間 O(1)
思路技巧在于記錄下這么幾個變量:dummyHead、子鏈反轉前的頭節點,子鏈反轉前頭節點前面一個節點,子鏈反轉過程中的當前節點,子鏈反轉過程中的下一個節點,這五個指針。先跳過前m個節點,然后初始化好這五個指針后,用I中的方法反轉鏈表。完成了第n個節點的反轉后,將子鏈反轉前的頭節點的next設為子鏈反轉過程中的下一個節點,將子鏈反轉前頭節點前面一個節點的next設為子鏈反轉過程中的當前節點。由于設置了dummyhead,我們所有的反轉操作都是不包含頭節點的,所以直接返回dummyhead的next就行了。
注意跳過前m個節點的for循環要從1開始,因為我們要保證head是第m-1個元素,如果m=1則不動。
代碼public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if(head == null || head.next == null) return head; ListNode dummy = new ListNode(0); dummy.next = head; head = dummy; for(int i = 1 ; i < m; i++){ head = head.next; } ListNode headOfSubList = head.next; ListNode nodeBeforeHead = head; ListNode nextNode = head.next.next; ListNode currNode = head.next; for(int i = m; i < n ; i++){ ListNode tmp = nextNode.next; nextNode.next = currNode; currNode = nextNode; nextNode = tmp; } headOfSubList.next = nextNode; nodeBeforeHead.next = currNode; return dummy.next; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64500.html
摘要:反轉一個單鏈表。示例輸入輸出進階你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題解題思路每次遍歷到最后一位取節點這種方法就算了時間復雜度太高。從鏈表末尾向頭部逐個分離節點,并將節點添加到新鏈表的末尾。與迭代法原理相似。 反轉一個單鏈表。 Reverse a singly linked list. 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2...
摘要:反轉一個單鏈表。示例輸入輸出進階你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題解題思路每次遍歷到最后一位取節點這種方法就算了時間復雜度太高。從鏈表末尾向頭部逐個分離節點,并將節點添加到新鏈表的末尾。與迭代法原理相似。 反轉一個單鏈表。 Reverse a singly linked list. 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2...
摘要:算法思路兩種方法一般反轉遞歸法一般解決定義三個指針,分別為,存儲當前結點,指向反轉好的結點的頭結點,存儲下一結點信息。遞歸法重點分析先確定終止條件當下一結點為時,返回當前節點判斷當前的鏈表是否為遞歸找到尾結點,將其存儲為頭結點。 Time:2019/4/23Title: Reverse Linked ListDifficulty: EasyAuthor: 小鹿 題目:Reverse...
摘要:代碼描述調轉指針解法非遞歸用三個指針,緊緊相鄰,不斷前進,每次將指向,將指向指向。描述遞歸解法測試結果 Reverse a singly linked list. 代碼ReverseLinkedList.java package list; public class ReverseLinkedList { /** * 描述 Reverse a singly...
摘要:三指針法復雜度時間空間思路基本的操作鏈表,見注釋。注意使用頭節點方便操作頭節點。翻轉后,開頭節點就成了最后一個節點。 Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should ...
閱讀 1422·2021-11-15 11:38
閱讀 3567·2021-11-09 09:47
閱讀 1969·2021-09-27 13:36
閱讀 3211·2021-09-22 15:17
閱讀 2547·2021-09-13 10:27
閱讀 2862·2019-08-30 15:44
閱讀 1158·2019-08-27 10:53
閱讀 2702·2019-08-26 14:00