链表反转-基础篇
题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
考察要点

  • 链表的熟悉程度
  • 迭代法和递归法两种实现思路
  • 迭代法:

    • 优点:效率高,运行时间只随循环的增加而增加;无额外开销;
    • 缺点:代码难理解;代码不如递归代码简洁;
  • 递归法:

    • 优点:用有限的循环语句实现无限集合;代码易读;大问题转化成小问题,减少代码量;
    • 缺点:递归不断调用函数,浪费空间;容易造成堆栈溢出。
  • 复杂度:时间复杂度O(N),空间复杂度O(1)

解法1:迭代法
通过双指针,遍历 head 指针,通过中间变量,逐步指向新的 head 节点,完成链表反转

type ListNode struct {
   Val  int
   Next *ListNode
}

func reverseList(head *ListNode) *ListNode {
   if head == nil {
      return nil
   }
   var newHead *ListNode
   for head != nil {
      node := head.Next
      head.Next = newHead
      newHead = head
      head = node
   }
   return newHead
}

解法2:递归法
整体思路是递归到最后一个节点,这个节点就是链表反转后的头节点,这里记作 ret,最终只需要返回这个 ret 指针即可,剩余的都是对中间数据进行指针反转。

type ListNode struct {
   Val  int
   Next *ListNode
}

func reverseList(head *ListNode) *ListNode {
   if head == nil || head.Next == nil {
      return head
   }

   ret := reverseList(head.Next)
   head.Next.Next = head
   head.Next = nil
   return ret
}

链表反转-进阶篇
题目
反转从位置 m 到 n 的链表. 请使用一趟扫描完成反转.
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
考察要点

  • m和n之间的反转与基础篇一样
  • 在m的边界处理,m-1的next指向n;m的next指向n+1
  • 在n的边界处理,n的next指向n-1;
    解法1:迭代法

    func reverseBetween(head *ListNode, m int, n int) *ListNode {
      dummy := ListNode{Val: 0}
      dummy.Next = head
      node := &dummy
      for i := 1; i < m; i++ {
          node = node.Next
      }
      pre := node
      curr := node.Next
      tail := curr
      for i := m; i <= n; i++ {
          nxt := curr.Next
          curr.Next = pre
          pre = curr
          curr = nxt
      }
      tail.Next = curr
      node.Next = pre
      return dummy.Next 
    }

    解法2:递归法

    type ListNode struct {
     Val  int
     Next *ListNode
    }
    
    func rev(root *ListNode) *ListNode {
     if root == nil || root.Next == nil {
        return root
     }
    
     last := rev(root.Next)
     root.Next.Next = root
     root.Next = nil
    
     return last
    }
    func reverseBetween(head *ListNode, left int, right int) *ListNode {
     d := &ListNode{
        Val:  0,
        Next: head,
     }
     h := d
     tmp := head
    
     var leftNode *ListNode
     var rightNode *ListNode
     var prevNode *ListNode
     var nextNode *ListNode
     foundLeft := false
     foundRight := false
     count := 1
     _ = rightNode
     for tmp != nil {
        if foundLeft && foundRight {
           break
        }
    
        if count == left {
           leftNode = d.Next
           d.Next = nil
           prevNode = d
           foundLeft = true
        }
    
        if count == right {
           rightNode = tmp
           nextNode = tmp.Next
           tmp.Next = nil
           foundRight = true
        }
    
        count++
        d = tmp
        tmp = tmp.Next
     }
    
     last := rev(leftNode)
     prevNode.Next = last
     leftNode.Next = nextNode
     return h.Next
    }

在别人绝望时加仓,在别人疯狂时清仓。

巴菲特说别人恐惧我贪婪,别人贪婪我恐惧。这句话值得深思。

什么时候别人才会恐惧?刚开始下跌或者瀑布下跌,别人还未必恐惧,甚至有点兴奋,觉得这是抄底的时机,因为牛市顶峰刚出站,他们还不相信熊市来临,更相信这是一次普通回调。群里,网上到处都是调侃,加仓的声音,很热闹。

然后随着时间推移,过了半年甚至一年,在持续下跌或者反复横盘震荡过程中,终于很多人没了耐心,开始离场,网上也没有讨论的兴致。

这时候,如果出现一次大的下跌,很多人都是绝望的,这次抄底,绝望中的抄底就是,在别人恐惧中我加仓。

别人贪婪我恐惧,当任何人都觉得可以随便挣钱,身边莫名其妙多了很多人参与,大家盲目乐观,一堆狗屁不值的东西飞上天,这时候就可以考虑离场了,不吃最后一段行情。

我觉着完整的牛市,一波行情能吃到70%就不错了。

按照缠中说禅周线看图,底部中枢买入,顶部第二个中枢离场。不要太贪婪,吃最后一段行情,要不没法全身而退,这是血淋淋的教训。

一直在纠结要不要发朋友圈

有同事、邻居、同学、朋友、中介。。各种各样的人

所以渐渐设置成三天可见,最后关闭了朋友圈

但是朋友圈毕竟是展示自己的一张名片,也是树立标签的好地方

所以还是放开朋友圈权限吧,随便看

以后尽量保持每月至少一次的更新,内容呢积极向上的生活照为主

展示自己积极乐观向上的一种形象。给未来留下美好记忆,也展示自己的形象。

这几天工作的事情,要面临okr考核,很是急躁,毕竟产出并不太高,对于我来说又是一次挑战。经过两天的调整,心态渐渐变好。

尽人事听天命,做好自己本分的工作,努力提升自己为目标,争取问心无愧。

凡事向内求,而不是向外求。内是什么,是内心,是自己,是本我,是主人翁。

外是什么?是外部的所有资源,如某个重要的人,某个重要的资产,某个重要的声誉。

遇到事情了,先静下心来,心平气和,集中注意力,反反复复问自己事情的原因是什么,过程是什么,我该怎么做。

有勇气、有毅力、冷静、果断的直接了当的去面对和迎接问题。

而不是向外求,别人怎么看我、声誉怎么样、后果怎么样。

本我是我自己的的主宰,本我能决定着事情的走向,本我认为事情是怎样的,它也会必然按照本我的意愿去发展。

换句话来说:精诚所至,金石为开;念念不忘,必有回响