又是很长时间才回来发一篇博客,前一个月确实因为杂七杂八的事情影响了很多,现在还是到了大火燃眉毛的时候了,也应该开始继续整理一下算法的思路了。Linked List大家应该是特别熟悉不过的了,因为这个算是数据结构了里面基本上最开始讲的结构吧。这块内容也没有太多需要琢磨的技巧,可以考量的东西也不多,所以考的就是一些小的trick来完成,面试中链表考得特别多,算是面试官对面试者的基础的考查,所以我建议大家在Linked List这一章,一定要实现Bug Free。这个也是我练的比较多的,有些想法可以和大家分享。

 

outline:

  • Dummy Node in Linked List
    • Remove Duplicates from Sorted List II
    • Reverse Linked List II
    • Partition List
  • Basic Linked List Skills
    • Sort List
    • Reorder List
  • Two Pointers in Linked List (Fast-slow pointers)
    • Merge K Sorted Lists

 

课堂笔记


1. Dummy Node in Linked List

有很多时候,我们需要对整个链表进行操作,这样会导致链表的结构发生变化,或者当需要返回的链表头是不确定的时候,我们就需要用一个Dummy Node来存那个开始的“头”,最后返回的也是这个“头”。这样就不需要单独对head进行操作了,第一个题目如下:

Remove Duplicates from Sorted List II

给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。

样例

给出 1->2->3->3->4->4->5->null,返回 1->2->5->null

给出 1->1->1->2->3->null,返回 2->3->null

这个题算是比较简单的题目,就是考虑链表的删除操作。但是如果不用dummy的话,可能还需要单独考虑head是否为重复元素,部分代码如下:

int val = head->val;
while (head->next && head->next->val == val) {
    head->next = head->next->next;
}
head = head->next;

这样就很麻烦,代码不够简洁,而且可能在某些地方出现问题。所以这里就引入dummy的方法(这块内容一定要朗读并背诵全文)(Bug Free):

    ListNode * deleteDuplicates(ListNode *head) {
        // write your code here
        if (!head || !head->next) {
            return head;
        }
        ListNode dummy = ListNode(0);
        dummy.next = head;
        head = &dummy;
        while (head->next && head->next->next) {
            if (head->next->val == head->next->next->val) {
                int val = head->next->val;
                while (head->next && head->next->val == val) {
                    head->next = head->next->next;
                }
            } else {
                head = head->next;
            }
        }
        return dummy.next;
    }
View Code

相关文章:

  • 2021-10-11
  • 2021-10-08
  • 2021-07-08
  • 2021-11-21
  • 2022-12-23
  • 2022-12-23
  • 2021-09-07
  • 2021-08-18
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-16
  • 2021-11-01
  • 2021-12-19
相关资源
相似解决方案