链表的反转
反转链表是基本题目,引申的题目很多,比如说一次反转长度为 N 的链表等
反转完整的单链表
Python
class Solution: # 返回ListNode def ReverseList(self, pHead): pre, cur = None, pHead while pHead: pHead = pHead.next cur.next = pre pre = cur cur = pHead return pre
Golang
package main import . "nc_tools" /* * type ListNode struct{ * Val int * Next *ListNode * } */ /** * * @param pHead ListNode类 * @return ListNode类 */ func ReverseList( pHead *ListNode ) *ListNode { var pre, cur *ListNode = nil, pHead for pHead != nil { pHead = pHead.Next cur.Next = pre pre = cur cur = pHead } return pre }
链表内指定区间反转
描述
将一个链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。
例如: 给出的链表为 1 -> 2 -> 3 -> 4 -> 5 -> NULL m=2,n=4 返回 1 -> 4 -> 3 -> 2 -> 5 -> NULL
注意:
给出的 mm,nn 满足以下条件:
链表长度1 ≤ m ≤ n ≤ 链表长度
分析
这道题可以分解为两部分
- 先反转从 m 到 n 的链表
- 把 m - 1 的指正接到 m, n 的指针接到 n + 1 节点上
实现
Python3
class Solution: def reverseBetween(self , head , m , n ): dummy = ListNode(-1) pre = dummy for i in range(1, m): pre = pre.next cur = pre.next for i in range(m, n): next = cur.next cur.next = next.next next.next = pre.next pre.next = next return dummy.next
Golang
func reverseBetween( head *ListNode , m int , n int ) *ListNode { // write code here dummy := &ListNode{ Val: -1, Next: head, } pre := dummy for i := 1; i < m; i++ { pre = pre.Next } cur := pre.Next for i := m; i < n; i++ { next := cur.Next cur.Next = next.Next next.Next = pre.Next pre.Next = next } return dummy.Next }
END