アルゴリズムにリンクされたリスト操作の質問ルーチン

0.まえがき

簡単な質問ですが、練習も覚えもしていないので、書けないかもしれません。面接では、短時間で書けることが多いです。絵や控除を描く時間がありません。頭の中ですぐにやる。、久しぶりにつづりを感じないこともある。書き留めても翌週から1ヶ月で忘れてしまう。バグを書くのはまだ大変。無料。これを深く理解している人としては、私と同じかもしれません。この記事のリンクリストのように、99%の人が反転しています。地図に描くことができれば、間違いなく書くことができます。境界線が非常に単純で、オランダの旗をすばやく並べ替えるのと同じです。これらのトピックは国内の面接レベルです。旗のような会社よりも少し悪いです。アルゴリズムについてはあまり知識がありませんが、学校での採用時の質問も多く、まだほとんど知らないので、記憶がありません。いつもバカだと感じています。こんなに簡単なトピックは書けませんが、それでもアルゴリズムとデータ構造をテストすることは、実際には会社がプログラマーを評価するための思考を評価するための最も公正で最も有能な方法であると感じています。私も含めて多くのことを言いました。私は周りのさまざまなアルゴリズムの神に押しつぶされてきました。フルスタックエンジニアへの道を進むと、純粋に技術的に、私自身のアルゴリズムとデータ構造はどんどん良くなる可能性があります。

1.クラシックトピック、リンクリストリバース

//递归方式
public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null)
      return head;
    ListNode next = head.next;
    ListNode new_head = reverseList(next);
    next.next = head;
    head.next = null;
    return new_head;
}
//遍历
public ListNode reverseList(ListNode head) {

    ListNode pre = null, cur = head,next = null;
    while( cur != null) {
        next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }

    return pre;
} 

2.隣接リバース、部分リバース

//反转相邻节点链表1234 2143,反转5个的也类似
public ListNode swapPairs(ListNode head) {
  if (head == null || head.next == null)
    return head;

  ListNode newNode = head.next;
  head.next = swapPairs(head.next.next);
  newNode.next = head;
  return newNode;
}

//部分反转,12345 m=2 n=4 14325
public ListNode reverseBetween(ListNode head, int m, int n) {
  if (m>= n) return head;
  ListNode dump = new ListNode(0);
  dump.next = head;
  ListNode pre = dump;
  for (int i = 1; i< m; i++) {
    pre = pre.next;
  }

  head = pre.next;
  for (int i=m;i<n;i++) {
    ListNode nex = head.next;
    head.next = nex.next;
    next.next = pre.next;
    pre.next = nex;
  }

  return dump.next;
} 

3.リンクリストの合計

//两个链表求和
//输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
//输出:7 -> 0 -> 8
//原因:342 + 465 = 807
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
       ListNode resultListNode = new ListNode(0);
       ListNode current = resultListNode;
       int carry = 0;
       while(l1 !=null || l2 !=null){
           int sum = carry;
           if(l1!=null){
               sum += l1.val;
               l1 = l1.next;
           }
           if(l2!=null){
               sum += l2.val;
               l2 = l2.next;
           }
           int val = sum < 10?sum:sum - 10;
           carry = sum < 10 ?0:1;
           current.next = new ListNode(val);
           current =  current.next;
       }
        if(carry  == 1){
            current.next = new ListNode(1);
        }
        return resultListNode.next;
    } 

Wu Xie、Xiao San Ye、バックグラウンドの小さな新人、ビッグデータ、人工知能。もっと注意してくださいファイル

おすすめ

転載: blog.csdn.net/hu_lichao/article/details/112452048