LeetCode-链表题总结

一. 链表反转类

        解决这类问题的关键在于分析指针的变化情况。

  1. 反转链表 (leetcode206)

      定义新节点pre为新链表的尾部,遍历时将当前结点插入。

     

 

 

  2. 成对交换 (leetcode24)

     这里和上题类似,只不过是每两个结点进行遍历操作。

       i) 更新遍历的节点位置

       ii)进行结点移动操作,这里主要是总结出移动后的指向。

     

 

 

  3.  K个一组翻转链表(leetcode25)

     这一题又和上题类似,只不过每次操作变成了k个元素。把握每次遍历时的节点更新操作(newCur和newPre),每次移动的规律(这里是对k个进行移动)

     

 

 

    总结规律:

      用遍历的方法,只不过每次遍历时操作的节点数不同,需要提前对遍历iterator的更新值进行保存。

     在每一次过程中,找出移动的规律结点指向的变化

 

二. 快慢指针类

1. 删除链表的倒数第N个结点(leetcode19)

   i) 快指针先定位到N位置,之后快慢指针一起移动(但这里我移动到删除位置的前一个)

   ii) 需要分几类情况分别考虑 - 删除表头/表尾/中间结点

  

2. 环形链表 - 判断链表中是否有环(leetcode141)

   快指针每次走2步,慢指针每次走1步,判断是否会相等(或快指针先为空)

   

3. 环形链表II - 找到环的位置(leetcode142)

这里的分析非常关键,还可以进行拓展(比如计算链表的长度

4. 旋转链表 

     这里和删除倒数第N个结点有类似之处。

    关键:1)确定好newHead, newTail的位置 —— 采用快慢指针进行定位

             2)分情况进行讨论(头/尾/中间位置)

 

 

三. 对链表插入、遍历等基本操作

 1. 对链表进行插入排序 (No.147)

    这一题就是对链表进行遍历,同时保存一个新链表(有序),每次遍历,执行在新链表上的插入操作。

    这里也要根据插入的位置分类讨论。

 

 

 

 

 

 

 

 

 
posted @ 2020-03-14 23:34  青云_1999  阅读(191)  评论(0)    收藏  举报