206. Reverse linkedlist
206_solution1.c
#include "list_node.h"
struct ListNode *reverseList(struct ListNode *head) {
struct ListNode *prev = NULL;
struct ListNode *cur = head;
while (cur != NULL) {
struct ListNode *next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
206_solution2.c
#include "list_node.h"
struct ListNode *reverseList(struct ListNode *head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode *newHead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
list_node.h
#pragma once
#include <stddef.h>
// Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
206_solution1.cpp
#include "list_node.h"
class Solution {
public:
ListNode *reverseList(ListNode *head) {
ListNode *prev = nullptr;
ListNode *cur = head;
while (cur != nullptr) {
ListNode *next = cur->next; // save next node
cur->next = prev; // reverse the link
prev = cur; // move prev forward
cur = next; // move cur forward
}
return prev; // prev is the new head
}
};
206_solution2.cpp
#include "list_node.h"
class Solution {
public:
ListNode *reverseList(ListNode *head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode *newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}
};
list_node.h
#pragma once
// Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
206_solution1.go
package linkedlists
func reverseList(head *ListNode) *ListNode {
var prev *ListNode
cur := head
for cur != nil {
next := cur.Next
cur.Next = prev
prev = cur
cur = next
}
return prev
}
206_solution2.go
package linkedlists
func reverseList(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
newHead := reverseList(head.Next)
head.Next.Next = head
head.Next = nil
return newHead
}
list_node.go
package linkedlists
// Definition for singly-linked list.
type ListNode struct {
Val int
Next *ListNode
}
206_solution1.java
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
}
206_solution2.java
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
ListNode.java
// Definition for singly-linked list.
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
206_solution1.js
const ListNode = require("./list_node");
var reverseList = function (head) {
let prev = null;
let cur = head;
while (cur !== null) {
const next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
};
206_solution2.js
const ListNode = require("./list_node");
var reverseList = function (head) {
if (head === null || head.next === null) {
return head;
}
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
};
list_node.js
// Definition for singly-linked list.
function ListNode(val, next) {
this.val = val === undefined ? 0 : val;
this.next = next === undefined ? null : next;
}
module.exports = ListNode;
206_solution1.py
from list_node import ListNode
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
prev = None
cur = head
while cur:
next_node = cur.next
cur.next = prev
prev = cur
cur = next_node
return prev
206_solution2.py
from list_node import ListNode
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head is None or head.next is None:
return head
new_head = self.reverseList(head.next)
head.next.next = head
head.next = None
return new_head
list_node.py
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
206_solution1.rs
use crate::list_node::ListNode;
impl Solution {
pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut prev = None;
let mut cur = head;
while let Some(mut node) = cur {
cur = node.next.take();
node.next = prev;
prev = Some(node);
}
prev
}
}
206_solution2.rs
use crate::list_node::ListNode;
impl Solution {
pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
fn helper(
node: Option<Box<ListNode>>,
prev: Option<Box<ListNode>>,
) -> Option<Box<ListNode>> {
match node {
None => prev,
Some(mut n) => {
let next = n.next.take();
n.next = prev;
helper(next, Some(n))
}
}
}
helper(head, None)
}
}
list_node.rs
// Definition for singly-linked list.
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>,
}
impl ListNode {
#[inline]
pub fn new(val: i32) -> Self {
ListNode { val, next: None }
}
}