/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ funcrightSideView(root *TreeNode) []int { if root == nil { // 树为空 return []int{} } res := []int{} // 记录结果 q := []*TreeNode{root} // 队列,根节点入队
for i := 0; len(q) > 0; i++ { p := []*TreeNode{} // p记录下一层节点 res = append(res, q[len(q)-1].Val) // 将本层最右边的节点加入结果集 for j := 0; j < len(q); j++ { // 将下一层节点加入队列 cur := q[j] if cur.Left != nil { // 左子树不为空,入队 p = append(p, cur.Left) } if cur.Right != nil { // 右子树不为空,入队 p = append(p, cur.Right) } } q = p // 已经遍历过本层节点,将q更新为下一层节点 }
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ funcreorderList(head *ListNode) { mid := midNode(head) // 得到中间的节点 l1, l2 := head, mid.Next // 待合并的两个链表头 mid.Next = nil l2 = reverse(l2) // 反转后面的链表
// 下面开始合并l1, l2 p, q := l1, l2 // p q 分别指向l1 l2 for q != nil { r := q.Next // 记录q的后继 // 将q指向的节点插入到p后面 q.Next = p.Next p.Next = q // p q向后移动 p = q.Next // p指向新插入q的后继 q = r } }
funcmidNode(head *ListNode) *ListNode { // 返回链表最中间的节点(个数为偶数时,返回靠左侧的节点) // 定义快慢指针 low, fast := head, head for fast.Next != nil && fast.Next.Next != nil { // 慢指针走一步 low = low.Next // 快指针走两步 fast = fast.Next.Next }
return low }
funcreverse(head *ListNode) *ListNode { // 链表逆置,返回链表头 var pre, cur *ListNode // cur为当前节点,pre为cur的前驱 cur = head for cur != nil { // 链表原地逆置 pre, cur, cur.Next = cur, cur.Next, pre }
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ funcdeleteDuplicates(head *ListNode) *ListNode { // 新建一个虚拟的头节点,指向原链表头 newHead := &ListNode{} newHead.Next = head cur, pre := head, newHead // cur指向当前遍历的节点,pre为cur的前驱 var flag bool// 标记当前节点是否为重复节点 for cur != nil { flag = false for cur.Next != nil && cur.Val == cur.Next.Val { // 当cur的下一个节点的Val等于cur的Val时循环,删除与cur的Val相同的下一个节点 // 删除下一个节点 cur.Next = cur.Next.Next // 标记当前节点重复 flag = true } // 此时cur后继的Val与cur不同 if flag { // cur为重复节点,删除cur pre.Next = cur.Next cur = pre.Next } else { // cur不是重复节点,pre cur同步后移 pre = cur cur = cur.Next } }