Welcome to Subscribe On Youtube
Question
Formatted question description: https://leetcode.ca/all/206.html
206. Reverse Linked List
Level
Easy
Description
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
Solution
The recursive solution is to do the reverse operation for head.next
, and set head.next.next = head
and head.next = null
.
The iterative solution uses two pointers, prev
and curr
. Initially, prev
is null
and curr
points to head
. Each step, let nextTemp
be the next node of curr
before reversing curr
. Set curr.next = prev
. After that, set both prev
and curr
to the next step (that is, prev = curr
and curr = nextTemp
). The loop ends when all nodes in the original list are reversed.
Code
-
public class Reverse_Linked_List { /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ /* 1,2,3,4,5 2,1 prev=2 - 3,4,5 current=3 3,2,1 prev=3 - 4,5 current=4 ... */ // https://leetcode.com/problems/reverse-linked-list/solution/ class Solution_oj_iterative { public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode nextTemp = curr.next; curr.next = prev; prev = curr; curr = nextTemp; } return prev; } } class Solution_oj_recursively { public ListNode reverseList(ListNode head) { if (head == null || head.next == null) return head; ListNode p = reverseList(head.next); head.next.next = head; head.next = null; return p; } } class Solution_recursively { public ListNode reverseList(ListNode head) { ListNode dummy = new ListNode(0); // dummy.next = head; ListNode current = head; reverse(dummy, current); return dummy.next; } private void reverse(ListNode dummy, ListNode current) { if (current == null) { return; } ListNode newHead = current.next; ListNode oldDummyNext = dummy.next; dummy.next = current; current.next = oldDummyNext; current = newHead; this.reverse(dummy, current); } } class Solution_iteratively { public ListNode reverseList(ListNode head) { ListNode dummy = new ListNode(0); // dummy.next = head; ListNode current = head; while (current != null) { ListNode newHead = current.next; ListNode oldDummyNext = dummy.next; dummy.next = current; current.next = oldDummyNext; // initial node, oldDummyNext is null, which is what we want, and which is why "// dummy.next = head;" is commented out above current = newHead; } return dummy.next; } } } ############ /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { ListNode dummy = new ListNode(); ListNode curr = head; while (curr != null) { ListNode next = curr.next; curr.next = dummy.next; dummy.next = curr; curr = next; } return dummy.next; } }
-
// OJ: https://leetcode.com/problems/reverse-linked-list/ // Time: O(N) // Space: O(1) class Solution { public: ListNode* reverseList(ListNode* head) { ListNode h; while (head) { auto p = head; head = head->next; p->next = h.next; h.next = p; } return h.next; } };
-
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: pre, p = None, head while p: q = p.next p.next = pre pre = p p = q return pre class Solution(object): # recursive def reverseList(self, root): if not root or not root.next: return root ret = self.reverseList(root.next) root.next.next = root # root.next is end of the newly reversed list ret root.next = None return ret class Solution: def reverseList(self, head: ListNode) -> ListNode: dummy = ListNode() curr = head while curr: next = curr.next curr.next = dummy.next dummy.next = curr curr = next return dummy.next
-
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func reverseList(head *ListNode) *ListNode { dummy := &ListNode{} curr := head for curr != nil { next := curr.Next curr.Next = dummy.Next dummy.Next = curr curr = next } return dummy.Next }
-
/** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */ function reverseList(head: ListNode | null): ListNode | null { if (head == null) { return head; } let pre = null; let cur = head; while (cur != null) { const next = cur.next; cur.next = pre; [pre, cur] = [cur, next]; } return pre; }
-
/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} head * @return {ListNode} */ var reverseList = function (head) { let dummy = new ListNode(); let curr = head; while (curr) { let next = curr.next; curr.next = dummy.next; dummy.next = curr; curr = next; } return dummy.next; };
-
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int val=0, ListNode next=null) { * this.val = val; * this.next = next; * } * } */ public class Solution { public ListNode ReverseList(ListNode head) { ListNode pre = null; for (ListNode p = head; p != null;) { ListNode t = p.next; p.next = pre; pre = p; p = t; } return pre; } }
-
// Definition for singly-linked list. // #[derive(PartialEq, Eq, Clone, Debug)] // pub struct ListNode { // pub val: i32, // pub next: Option<Box<ListNode>> // } // // impl ListNode { // #[inline] // fn new(val: i32) -> Self { // ListNode { // next: None, // val // } // } // } impl Solution { pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> { match head { None => None, Some(mut head) => { let mut cur = head.next.take(); let mut pre = Some(head); while let Some(mut node) = cur { let next = node.next.take(); node.next = pre; pre = Some(node); cur = next; } pre } } } }