当前位置:网站首页>Algorithem_ ReverseLinkedList
Algorithem_ ReverseLinkedList
2022-04-23 15:54:00 【Mokong 9081】
Given the head of a singly linked list, reverse the list, and return the reversed list.
<!--more-->
Given the head of a singly linked list, reverse the list, and return the reversed list.
Example 1:
Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]
Example 2:
Input: head = [1,2]
Output: [2,1]
Example 3:
Input: head = []
Output: []
Constraints:
The number of nodes in the list is the range 0, 5000.
-5000 <= Node.val <= 5000
Follow up: A linked list can be reversed either iteratively or recursively. Could you implement both?
Solution 1
First of all followup, The most direct solution is , I put LinkNode Converted to an array , Then the array is in reverse order , Regenerate into new LinkNode
The code is as follows :
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func reverseList(_ head: ListNode?) -> ListNode? {
if head == nil || head?.next == nil {
return head
}
var newNode = head
var nodeList: [Int] = []
while newNode != nil {
nodeList.append(newNode!.val)
newNode = newNode?.next
}
var resultNode = ListNode(nodeList[nodeList.count - 1])
var tempNode: ListNode?
for i in 0...nodeList.count - 2 {
let item = nodeList[nodeList.count - 2 - i]
let generateNode = generateNewNode(item)
if tempNode == nil {
resultNode.next = generateNode
}
else {
tempNode?.next = generateNode
}
tempNode = generateNode
}
return resultNode
}
func generateNewNode(_ val: Int) -> ListNode? {
return ListNode(val)
}
}
Solution 2
It's troublesome to understand here , May refer to ,Reverse a linked list, The video at the bottom of the page , Look at it several times. .
Iterative method :
- Declare three pointers ,prev = nil, current = head, next = nil,
- Loop traversal LinkedList
- change next front , First save next, Set up next = current.next
- Then change next, This step is reverse The key to , Set up current.next = prev
- then prev and current Move to the next node , Set up prev = current, current = next
The code is as follows :
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func reverseList(_ head: ListNode?) -> ListNode? {
var mutHead = head
if mutHead == nil || mutHead?.next == nil {
return mutHead
}
// initialize three pointers
// prev as NULL, curr as head, next as NULL
var prev: ListNode?
var curr = head
var next: ListNode?
// iterate through the link list, in the loop do the following
while (curr != nil) {
// Before changing next of current
// store the next node
next = curr?.next
// Now change next of current
// This is where revering happens
curr?.next = prev
// Move the prev and curr one step ahead
prev = curr
curr = next
}
return prev
}
}
Solution 3
The recursive method : A different understanding ,Reverse Linked List
The important thing is to change next Pointer to , Instead of assigning different values
- Declare two ListNode,prev and temp
- prev Used to represent the previous ,temp Represents temporarily stored , add mutHead Current , There are still three ListNode
- loop ,mutHead Not empty ,
- temp = mutHead, hold temp Assign to current
- mutHead = mutHead.next, hold mutHead Assign to the next
- temp.next = prev, hold temp Of next Point to prev, Note that this time temp The value of is current , That is, the current next is prev, The direction of the pointer is reversed
- prev = temp, hold prev The assignment is temp, namely prev Assign to current , Then continue the next traversal , know mutHead Empty stop
The code is as follows :
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func reverseList(_ head: ListNode?) -> ListNode? {
var mutHead = head
if mutHead == nil || mutHead?.next == nil {
return mutHead
}
var prev: ListNode?
var temp: ListNode?
while (mutHead != nil) {
temp = mutHead
mutHead = mutHead?.next
temp?.next = prev
prev = temp
}
return prev
}
}
Method four
The recursive method , Reference resources reclusive reverse linked list,
Mainly need to understand :
Each step of recursion is assigned a value curr.next.next = curr and curr.next = nil Two steps
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func reverseList(_ head: ListNode?) -> ListNode? {
var mutHead = head
if mutHead == nil || mutHead?.next == nil {
return mutHead
}
// recursive
let newHead = reverseList(mutHead?.next)
// The following code should be viewed separately
// mutHead?.next refer to mutHead Next ListNode
// mutHead?.next?.next refer to mutHead Next ListNode Of next Point to
// That's it reverse Point to
mutHead?.next?.next = mutHead
// And then put mutHead?.next namely mutHeead Of next Point to clear
mutHead?.next = nil
return newHead
}
}
版权声明
本文为[Mokong 9081]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231406039118.html
边栏推荐
- 糖尿病眼底病变综述概要记录
- Sortby use of spark operator
- [section 5 if and for]
- Deletes the least frequently occurring character in the string
- Vision of building interstellar computing network
- How do you think the fund is REITs? Is it safe to buy the fund through the bank
- How can poor areas without networks have money to build networks?
- Application case of GPS Beidou high precision satellite time synchronization system
- Codejock Suite Pro v20. three
- Application of Bloom filter in 100 million flow e-commerce system
猜你喜欢
Why is IP direct connection prohibited in large-scale Internet
CVPR 2022 quality paper sharing
The principle and common methods of multithreading and the difference between thread and runnable
MySQL - execution process of MySQL query statement
TIA博图——基本操作
Codejock Suite Pro v20. three
布隆过滤器在亿级流量电商系统的应用
【现代电子装联期末复习要点】
大型互联网为什么禁止ip直连
现在做自媒体能赚钱吗?看完这篇文章你就明白了
随机推荐
C language self compiled string processing function - string segmentation, string filling, etc
PHP classes and objects
[AI weekly] NVIDIA designs chips with AI; The imperfect transformer needs to overcome the theoretical defect of self attention
Large factory technology implementation | industry solution series tutorials
Application case of GPS Beidou high precision satellite time synchronization system
Partitionby of spark operator
Spark 算子之交集、并集、差集
js正則判斷域名或者IP的端口路徑是否正確
Spark 算子之groupBy使用
C, calculation method and source program of bell number
Best practices of Apache APIs IX high availability configuration center based on tidb
JVM - Chapter 2 - class loader subsystem
Website pressure measurement tools Apache AB, webbench, Apache jemeter
实现缺省页面
Go language slice, range, set
一刷313-剑指 Offer 06. 从尾到头打印链表(e)
Neodynamic Barcode Professional for WPF V11. 0
Compile, connect -- Notes
Codejock Suite Pro v20.3.0
Treatment of idempotency