经典链表试题(二)

文章目录

  • 一、移除链表元素
    • 1、题目介绍
    • 2、思路讲解
    • 3、代码实现
  • 二、反转链表
    • 1、题目介绍
    • 2、思路讲解
    • 3、代码实现
  • 三、相交链表
    • 1、题目介绍
    • 2、思路讲解
    • 3、代码实现
  • 四、链表的中间结点
    • 1、题目介绍
    • 2、思路讲解
    • 3、代码实现
  • 五、设计循环队列
    • 1、题目介绍
    • 2、思路讲解
    • 3、代码实现
  • 六、两两交换链表中的节点
    • 1、题目介绍
    • 2、思路讲解
    • 3、代码实现


一、移除链表元素

1、题目介绍

经典链表试题(二)_第1张图片

经典链表试题(二)_第2张图片


2、思路讲解

定义两个指针cur和prev,cur指向head,以cur为条件,进行遍历循环,分为cur的值等于val和不等于val两种情况,分别处理。


3、代码实现

经典链表试题(二)_第3张图片


二、反转链表

1、题目介绍

经典链表试题(二)_第4张图片
经典链表试题(二)_第5张图片


2、思路讲解

定义三个指针,cur指向头结点,newHead指向空,next指向cur的下一个结点,遍历cur,最后返回newHead。


3、代码实现

经典链表试题(二)_第6张图片


三、相交链表

1、题目介绍

经典链表试题(二)_第7张图片
经典链表试题(二)_第8张图片


2、思路讲解

先求出链表1和链表2的长度,和判断他们是否最后相等,如果不相等就不存在橡胶链表,然后将链表长的那个,走两链表长度之差,最后看他们在哪里相等,哪里就是第一个相交链表


3、代码实现

经典链表试题(二)_第9张图片


四、链表的中间结点

1、题目介绍

经典链表试题(二)_第10张图片
经典链表试题(二)_第11张图片


2、思路讲解

定义快慢指针,当快指针未空时,返回慢指针。


3、代码实现

经典链表试题(二)_第12张图片


五、设计循环队列

1、题目介绍

经典链表试题(二)_第13张图片
经典链表试题(二)_第14张图片


2、思路讲解

我们同样可以用链表实现队列,用链表实现队列则较为简单,因为链表可以在 O(1)O(1)O(1) 时间复杂度完成插入与删除。入队列时,将新的元素插入到链表的尾部;出队列时,将链表的头节点返回,并将头节点指向下一个节点。


3、代码实现

typedef struct {
    int* a;
    int front;
    int rear;
    int k;

} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->a=(int*)malloc(sizeof(int)*(k+1));
    obj->rear=obj->front=0;
    obj->k=k;
    return obj;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {

    return ((obj->rear+1)%(obj->k+1))==(obj->front);
}
 bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->rear==obj->front;

}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
   if(myCircularQueueIsFull(obj))
   {
       return false;
   }
    obj->a[obj->rear]=value;
    obj->rear++;
    (obj->rear)%=(obj->k+1);
    return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
     if(myCircularQueueIsEmpty(obj))
    return  false ;

    obj->front++;
    (obj->front)%=(obj->k+1);
    return true;

}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return -1;


     else
    return obj->a[obj->front];

}

int myCircularQueueRear(MyCircularQueue* obj) {
     if(myCircularQueueIsEmpty(obj))
    return -1;

    else
    return obj->a[(obj->rear+obj->k)%(obj->k+1)];

}

void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    free(obj);
}


六、两两交换链表中的节点

1、题目介绍

经典链表试题(二)_第15张图片

经典链表试题(二)_第16张图片


2、思路讲解

可以通过递归的方式实现两两交换链表中的节点。

递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。

如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。


3、代码实现

经典链表试题(二)_第17张图片


你可能感兴趣的:(链表,数据结构)