反转单链表

1. 题目描述

输入一个链表,反转链表后,输出新链表的表头。

2. 示例

3. 解题思路

输入的链表头指针为None或者整个链表只有一个结点时,反转后的链表出现断裂,返回的翻转之后的头节点不是原始链表的尾结点。因此需要引入一个翻转后的头结点,以及一个指向当前结点的指针,一个指向当前结点前一个结点的指针,一个指向当前结点后一个结点的指针,防止出现断裂。

image.png

递归反转链表实现,相对比较容易一些

4. Java实现

比较简单的非递归的实现方法:
/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        // 如果是head为空,或者只有一个节点,则直接返回
        if (head == null || head.next == null){
            return head;
        }
        ListNode p = head;
        ListNode newHead = null; // 新的头节点
        
        while(p != null){
            ListNode temp = p.next; // 保存p指向下一个节点的指针
            p.next = newHead;
            newHead = p; // 更新头节点
            p = temp;  // 即 p = p.next ,更新p节点
        }
        return newHead;
        
    }
}
使用递归的实现方法:
/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        // 使用递归的方法
        if (head == null || head.next == null){
            return head;
        }
        ListNode headNext = ReverseList(head.next);
        head.next.next = head;
        head.next = null;
        return headNext;
 
    }
}

5. Python实现

比较简单的非递归的实现方法:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'mike_jun'
__mtime__ = '2019-5-24'
#目的: 反转单链表
"""
def reverseLink(head):
    #pass
    if not head or not head.next:
        return head
    p = head
    newHead = None
    while p:
        temp = p.next
        p.next = newHead
        newHead = p
        p = temp
    return newHead
 
#创建一个单链表
class Node():
    def __init__(self, values):
        self.next = None
        self.values = values
 
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node1.next = node2
node2.next = node3
node3.next = node4
 
def printNode(head):
    result = []
    while head:
        result.append(head.values)
        head = head.next
    print(result)
printNode(node1)
newNode = reverseLink(node1)
printNode(newNode)
使用递归的实现方法:
/*python
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        // 使用递归的方法
        if (head == null || head.next == null){
            return head;
        }
        ListNode headNext = ReverseList(head.next);
        head.next.next = head;
        head.next = null;
        return headNext;
 
    }
}
如果您觉得本文有用,请点个“在看”

image.png


蜘蛛侠不会飞
51 声望8 粉丝