分隔链表
题目描述:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。然后指针后移寻找下一个位置
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
分析:
这是一道操作链表的题,定义两个指针,像快排是的,分别去找符合要求的节点,然后将后面符合要求的节点插到前面节点的前面。
代码:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func partition(head *ListNode, x int) *ListNode {
if head==nil || head.Next==nil{
return head
}
dummy:=&ListNode{}
dummy.Next=head
pre:=dummy
for pre.Next!=nil && pre.Next.Val<x{
pre=pre.Next
}
if pre.Next==nil{
return dummy.Next
}
p1:=pre.Next
p2:=p1.Next
for p2!=nil{
if p2.Val>=x{
p1=p2
p2=p1.Next
}else{
p1.Next=p2.Next
p2.Next=pre.Next
pre.Next=p2
pre=p2
p2=p1.Next
}
}
return dummy.Next
}
题目:回文链表
题目描述:
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
分析:
定义快慢指针,找到中间节点,然后反转后半部分链表,然后两边进行比较,是否一样
代码:
func isPalindrome(head *ListNode) bool {
if head==nil || head.Next==nil{
return true
}
slow:=head
fast:=head
for fast.Next!=nil && fast.Next.Next!=nil{
slow=slow.Next
fast=fast.Next.Next
}
cur:=slow.Next
slow.Next=nil
var prv *ListNode
for cur.Next!=nil{
node:=cur.Next
cur.Next=prv
prv=cur
cur=node
}
cur.Next=prv
for head!=nil && cur!=nil{
if head.Val != cur.Val{
return false
}
head=head.Next
cur=cur.Next
}
return true
}
题目:1029. 可被 5 整除的二进制前缀
题目描述:
给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。
返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。
示例 1:
输入:[0,1,1]
输出:[true,false,false]
解释:
输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。
示例 2:
输入:[1,1,1]
输出:[false,false,false]
示例 3:
输入:[0,1,1,1,1,1]
输出:[true,false,false,false,true,false]
示例 4:
输入:[1,1,1,0,1]
输出:[false,false,false,false,false]
分析:
所有的数被5整除就是五个状态,0,1,2,3,4,然后增加以为后就是在原来的基础上乘2加上新增的数,然后再判断他的状态,如果是0说明能被5整除。
代码:
func prefixesDivBy5(A []int) []bool {
n:=len(A)
res:=[]bool{}
if n<1{
return res
}
ret:=[][]int{
{0, 1},
{2, 3},
{4, 0},
{1, 2},
{3, 4},
}
state:=0
for i:=0;i<n;i++{
state=ret[state][A[i]]
if state==0{
res=append(res,true)
}else{
res=append(res,false)
}
}
return res
}