美文网首页Leetcode
链表-双指针

链表-双指针

作者: Catherin_gao | 来源:发表于2020-07-13 21:58 被阅读0次

双指针

  • 两个指针的起始点

面试题 02.02. 返回倒数第 k 个节点

剑指 Offer 22. 链表中倒数第k个节点

  • 习惯于k++, k值已知时,k--更优。
  • 不需要返回head时,可以修改head值。
class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        ListNode* first=head;
        int i=0;
        while(i<k && first->next != NULL)
        {
             first=first->next;
             i++;
        }
        ListNode* second=head;
        while(first != NULL)
        {
            first=first->next;
            second=second->next;
        }
        return second->val;
    }
};
class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        ListNode* second=head;
        while(k--)
            head=head->next;

        while(head != NULL)
        {
            head=head->next;
            second=second->next;
        }
        return second->val;
    }
};

19. 删除链表的倒数第N个节点

面试题 02.04. 分割链表

86. 分隔链表

141. 环形链表

  • while判断条件应该先判断在fast,在判断fast->next, 否则访问空指针。
  • 双指针的起始点可以相同
class Solution {
public:
    bool hasCycle(ListNode *head) {
         if(head ==NULL || head->next == NULL)
            return false;   //这两行可省略。
        ListNode* slow=head;   //双指针的起始点可以相同
        ListNode* fast=head->next;
        while(fast !=NULL && fast->next !=NULL ){
           if(slow == fast)
            return true;
           slow=slow->next;
           fast=fast->next->next;
        }
        return false;
    }
};
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode* slow=head;   //双指针的起始点可以相同
        ListNode* fast=head;
        while(fast !=NULL && fast->next !=NULL ){
           slow=slow->next;
           fast=fast->next->next;
           if(slow == fast)
            return true;
        }
        return false;
    }
};

61. 旋转链表

  • 问题出在边界条件上。先while判断,还是先i自减。
int k=3;
while(k--)
   cout<<k;
//输出为2,1,0
int k=3;
while(--k)
   cout<<k;
//输出为2,1
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(head==NULL)
          return head;
        ListNode* new_end=head;
        ListNode* count=head;
        int n=1;
        while(count->next!=NULL){
            count=count->next;
            n++;
        }
        count->next=head;
        int move=n-k%n;
        while(--move){
            new_end=new_end->next;
        }
        ListNode* new_head=new_end->next;
        new_end->next=NULL;
        return new_head;
    }
};

234. 回文链表

相关文章

  • 数据结构重学日记(十)双链表

    概念 单链表:单个指针,单向火车。 双链表:双指针,电梯。 双链表在单链表的基础上增加了一个指向前边结点的指针。 ...

  • LeetCode 探索中级 [俩数相加][奇偶链表][相交链表]

    链表 @[链表|双指针] 链表问题相对容易掌握。 不要忘记"双指针解法",它不仅适用于数组问题,而且还适用于链表问...

  • 纯C手撕leetcode-基本数据结构-链表

    技巧 假头 新链表 双指针(正反向指针,快慢指针) 递归 例子:1.合并两个有序链表(假头,新链表) 链表反转(假...

  • 算法学习--双指针

    双指针分类 快慢指针 左右指针 快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节...

  • leetCode 141 Linked List Cycle

    关键字:链表、双指针 难度:easy 题目大意:检测给定的链表是否存在环 题目: 解题思路: 1、采用双指针,起始...

  • 双指针

    一、双指针总结 1.1题目 快慢指针(主要解决链表中的问题) 141.环形链表 142.环形链表 II 876.链...

  • leetcode第19题:删除链表中倒数第N个结点

    题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 考点 链表 双指针、滑动窗口指针 解...

  • LeetCode 数组专题 4:双索引技术之一:对撞指针

    在 LeetCode 上,专门有一个标签,名为“双指针”,有数组中的“双指针”,也有单链表中的“双指针”。 例题1...

  • 2020-02-16 刷题 3(链表)

    21 合并两个有序链表 标签:归并,双指针,链表解题思路类似于二路归并算法,采用双指针法,将其中一个链表作为待合并...

  • 2.1 单链表的反转

    当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行...

网友评论

    本文标题:链表-双指针

    本文链接:https://www.haomeiwen.com/subject/tcgzqktx.html