反转单链表
1. 题目描述
输入一个链表,反转链表后,输出新链表的表头。
2. 示例
无
3. 解题思路
输入的链表头指针为None或者整个链表只有一个结点时,反转后的链表出现断裂,返回的翻转之后的头节点不是原始链表的尾结点。因此需要引入一个翻转后的头结点,以及一个指向当前结点的指针,一个指向当前结点前一个结点的指针,一个指向当前结点后一个结点的指针,防止出现断裂。
递归反转链表实现,相对比较容易一些
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;
}
}
如果您觉得本文有用,请点个“在看”
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。