<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      刪除單鏈表,你會嗎?

      刪除單鏈表中值等于XXX的所有元素
      不經意間看到了一個不同尋常的實現方法,覺得挺有意思,于是自己實現了一下,代碼真的是簡單明了跑得還賊快!
      好,現在先在腦海中想想,你會怎么實現?這么簡單,5秒鐘后,你想到了解決方案,于是你決定驗證你的思路,請繼續往下看
       
      定義鏈表節點結構如下:
      type ListNode struct {
         Next  *ListNode
         Value int
      }

       

      1:最常見思路
      定義一個保存上個節點的變量prev,當發現當前節點cur的值等于目標值,就將prev.next = cur.next,一直循環下去,跳過節點值等于目標值的所有節點,即刪除了所有值等XXX的節點,golang代碼實現如下:
      func RemoveNodeNormal(head *ListNode, value int) *ListNode {
         var prev *ListNode
         for cur := head; cur != nil; cur = cur.Next {
            if cur.Value == value {
               if prev != nil {
                  prev.Next = cur.Next
               } else {
                  head = cur.Next
               }
            } else {
               prev = cur
            }
         }
         return head
      }
      這么簡單,我就不做任何說明了,后面會附上完整代碼和簡單的單測
      你的思路是這樣的嗎?
      if 是 || !不是 {
          請繼續往下看  
      }
       
      2:第二常見思路
      我要走不尋常路,定義prev變量是不可能的,這次是不可能的,如果發現當前節點值等于目標值,就用下一個節點的值覆蓋當前節點的值,當前節點的下一個節點指向下下個節點。代碼實現如下:
      func RemoveNodeReplace(head *ListNode, value int) *ListNode {
         cur := head
         for cur != nil && cur.Value == value {
            if cur.Next == nil {
               return nil
            }
            cur.Value = cur.Next.Value
            cur.Next = cur.Next.Next
         }
         for cur != nil {
            if cur.Next != nil && cur.Next.Value == value {
               cur.Next = cur.Next.Next
            } else {
               cur = cur.Next
            }
         }
         return head
      }

       

       
      3:linus喜歡的代碼
      linus說代碼應該這樣寫,我就不做任何說明了,你品,你細品!!
      func RemoveNode(head *ListNode, value int) *ListNode {
         for cur := &head; *cur != nil; {
            if (*cur).Value == value {
               *cur = (*cur).Next
            } else {
               cur = &(*cur).Next
            }
         }
         return head
      }

       

       
      完整代碼如下,你可以跑著試一下: 
      package main
      
      import (
          "fmt"
      )
      
      type ListNode struct {
          Next  *ListNode
          Value int
      }
      
      func RemoveNodeNormal(head *ListNode, value int) *ListNode {
          var prev *ListNode
          for cur := head; cur != nil; cur = cur.Next {
              if cur.Value == value {
                  if prev != nil {
                      prev.Next = cur.Next
                  } else {
                      head = cur.Next
                  }
              } else {
                  prev = cur
              }
          }
          return head
      }
      
      func RemoveNodeReplace(head *ListNode, value int) *ListNode {
          cur := head
          for cur != nil && cur.Value == value {
              if cur.Next == nil {
                  return nil
              }
              cur.Value = cur.Next.Value
              cur.Next = cur.Next.Next
          }
          for cur != nil {
              if cur.Next != nil && cur.Next.Value == value {
                  cur.Next = cur.Next.Next
              } else {
                  cur = cur.Next
              }
          }
          return head
      }
      
      func RemoveNode(head *ListNode, value int) *ListNode {
          for cur := &head; *cur != nil; {
              if (*cur).Value == value {
                  *cur = (*cur).Next
              } else {
                  cur = &(*cur).Next
              }
          }
          return head
      }
      
      func ArrayToLink(nums []int) *ListNode {
          if len(nums) == 0 {
              return nil
          }
          head := &ListNode{
              Value: nums[0],
          }
          tail := head
          for i := 1; i < len(nums); i++ {
              tail.Next = &ListNode{
                  Value: nums[i],
              }
              tail = tail.Next
          }
          return head
      }
      
      func LinkToArray(head *ListNode) []int {
          var array []int
          for ; head != nil; head = head.Next {
              array = append(array, head.Value)
          }
          return array
      }
      
      func ArrayEqual(nums1, nums2 []int) bool {
          if len(nums1) != len(nums2) {
              return false
          }
          for i := 0; i < len(nums1); i++ {
              if nums1[i] != nums2[i] {
                  return false
              }
          }
          return true
      }
      
      func main() {
          tests := []struct {
              nums  []int
              value int
              res   []int
          }{
              {
                  []int{},
                  1,
                  []int{},
              },
              {
                  []int{1},
                  1,
                  []int{},
              },
              {
                  []int{1, 2},
                  1,
                  []int{2},
              },
              {
                  []int{1, 2},
                  2,
                  []int{1},
              },
              {
                  []int{1, 2, 1, 3, 1, 4, 1, 1, 1, 1, 1},
                  1,
                  []int{2, 3, 4},
              },
              {
                  []int{1, 2, 3, 2, 4, 2},
                  2,
                  []int{1, 3, 4},
              },
              {
                  []int{3, 1, 3, 2, 3, 4, 3},
                  3,
                  []int{1, 2, 4},
              },
              {
                  []int{4, 1, 4, 2, 4, 3, 4, 4, 4, 4, 4},
                  4,
                  []int{1, 2, 3},
              },
          }
      
          for _, test := range tests {
              head := ArrayToLink(test.nums)
              head = RemoveNode(head, test.value)
              array := LinkToArray(head)
              fmt.Println(ArrayEqual(array, test.res))
          }
      }

       

      如果你對算法感興趣,可以看看我刷的LeetCode:https://github.com/chentaihan/leetcode  

       

       

      posted @ 2019-12-19 13:25  古文觀芷  閱讀(959)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 偷拍精品一区二区三区| 亚洲日本欧洲二区精品| 国内精品久久久久影院薰衣草| 亚洲男女一区二区三区| 国产精品播放一区二区三区| 免费视频一区二区三区亚洲激情| 免费人成再在线观看视频| 日本丰满老妇bbb| 成人激情视频一区二区三区| 亚洲va久久久噜噜噜久久狠狠| 国产精品亚洲中文字幕| 中文字幕乱偷无码av先锋蜜桃| 精精国产xxx在线观看| 国产综合久久久久久鬼色| 风流老熟女一区二区三区| 视频一区视频二区中文字幕 | 国产精品内射在线免费看| 国产亚洲精品2021自在线| 少妇爽到呻吟的视频| 99在线精品免费视频| 99精品视频在线观看免费蜜桃| 国产精品久久久福利| 91精品蜜臀国产综合久久| 一本加勒比hezyo无码人妻| 欧美牲交a欧美牲交aⅴ免费| 国产小受被做到哭咬床单GV| 精品中文人妻在线不卡| 国产av黄色一区二区三区| 成人性生交大片免费看r老牛网站 中文字幕一区二区三区四区五区 久久久久久毛片免费播放 | 麻豆一区二区三区精品蜜桃| 亚洲综合色婷婷中文字幕| 亚洲乱码日产精品一二三| 国产亚洲色视频在线| 最新偷拍一区二区三区| 国产精品制服丝袜第一页| 男人进女人下部全黄大色视频| 亚洲色大成网站www永久男同| 7878成人国产在线观看| 国产亚洲第一精品| 中文字幕人妻有码久视频| 国产福利精品一区二区|