1.手撕链表反转算法题
2022-03-23
- 先做一个简单的,单链表反转
- 题目描述:给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点
// head = [1,2,3,4,5], 输出 [5,4,3,2,1]
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
* 迭代思路解决
*/
func reverseList(head *ListNode) *ListNode {
var pre *ListNode = nil
cur := head
nxt := head
for cur != nil {
//原始的nxt
nxt = cur.Next
// 让当前指针指向前一个
cur.Next = pre
// 更新pre指针和cur指针位置
pre = cur
cur = nxt
}
return pre
}
- 再来一个变形的
- 题目描述:反转区间[a,b)的元素
var pre *ListNode = nil
cur := head
for cur != b {
nxt := cur.Next
cur.Next = pre
pre = cur
cur = nxt
}
return pre
- 单链表反转变形题目
- 题目描述:给定一个单链表 1->2->3->4->5->6, 输入一个变量k ,假设k=3, 输出 3->2->1->6->5->4
- 答题限时 15分钟
解法一:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseKGroup(head *ListNode, k int) *ListNode {
if head == nil {
return head
}
a, b := head, head
for i := 0; i < k; i++ {
//不足k个的情况
if b == nil {
return head
}
b = b.Next
}
newHead := reverse(a, b)
a.Next = reverseKGroup(b, k)
return newHead
}
func reverse(a, b *ListNode) *ListNode {
var pre *ListNode = nil
cur := a
for cur != b {
nxt := cur.Next
cur.Next = pre
pre = cur
cur = nxt
}
return pre
}
解法二: