乾貨滿滿!!!面試必備OJ題:連結串列篇(一)

King of the match發表於2020-11-07

1、反轉一個單連結串列

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
class Solution {
    public ListNode reverseList(ListNode head) {
       ListNode newHead = null;
       ListNode cur = head;
       ListNode prev = null;
        while(cur != null) {
            ListNode curNext = cur.next;
            if(curNext == null) {
                newHead = cur;
            }
            cur.next = prev;
            prev = cur;
            cur = curNext;
        }
        return newHead;
    }
}

OJ連結

2、連結串列的中間節點

給定一個頭結點為 head 的非空單連結串列,返回連結串列的中間結點。
如果有兩個中間結點,則返回第二個中間結點。
示例1:

輸入:[1,2,3,4,5]
輸出:3

示例2:

輸入:[1,2,3,4,5,6]
輸出:4 (由於該列表有兩個中間結點,值分別為 34,我們返回第二個結點。)
class Solution {
    public ListNode middleNode(ListNode head) {
       ListNode fast = head;
       ListNode slow = head;
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }
}

OJ連結

3、迴文連結串列

示例 1:
輸入: 1 2
輸出: false 

示例 2:
輸入: 1 2 2 1
輸出: true 
class Solution {
    public boolean isPalindrome(ListNode head) {
       if(head == null) {
            return true;
        }
        if(head.next == null) {
            return true;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        //slow就是中間位置,開始進行第二步
        //2、進行反轉
        ListNode cur = slow.next;
        while(cur != null) {
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        //3、開始判斷
        while(head != slow) {
            if(head.val != slow.val) {
                return false;
            }
            //偶數情況下
            if(head.next == slow) {
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;
    }
}

OJ連結

4、判斷連結串列是否有環

給定一個連結串列,判斷連結串列中是否有環。
如果連結串列中存在環,則返回 true 。 否則,返回 false。
在這裡插入圖片描述

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow) {
               break;
            }
        }
        if(fast == null || fast.next == null) {
            return false;
        }
        return true; 
    }
}

OJ連結

5、環形連結串列

給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
         while(fast != null && fast.next != null) {
             fast = fast.next.next;
             slow = slow.next;
             if(fast == slow) {
                 break;
             }
         }
         if(fast == null || fast.next == null) {
             return null;
         }
             slow = head;
             while(slow != fast) {
             fast = fast.next;
             slow = slow.next;
         }
         return slow;
    }
}

OJ連結

6、刪除重複節點

在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。

public ListNode deleteDuplicates(ListNode head) {
      ListNode cur = head;
      ListNode newHead = new ListNode(-1);
      ListNode tmp = newHead;
           while(cur != null) {
               if(cur.next != null && cur.val == cur.next.val) {
                   while(cur.next != null && cur.val == cur.next.val) {
                       cur = cur.next;
                   }
                   cur = cur.next;
               }else {
                   tmp.next = cur;
                   tmp = tmp.next;
                   cur = cur.next;
               }
           }
           tmp.next = null;
           return newHead.next;
    }

7、分隔連結串列

給定一個連結串列和一個特定值 x,對連結串列進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。

示例:
輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5
//暴力解法
class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode bs = null;
        ListNode be = null;
        ListNode as = null;
        ListNode ae = null;
        ListNode cur = head;
        while(cur != null) {
            if(cur.val < x) {
                if(bs == null) {
                    bs = cur;
                    be = cur;
                }else {
                    be.next = cur;
                    be = be.next;
                }
            }else {
                if(as == null) {
                    as = cur;
                    ae = cur;
                }else {
                    ae.next = cur;
                    ae = ae.next;
                }
            }
            cur = cur.next;
        }
        if(bs == null) {
            return as;
        }
        //bs!=null;
        be.next = as;
        if(as != null) {
            ae.next = null;
        }
        return bs;
    }
}

OJ連結

相關文章