经典链表试题(二)

简介: 经典链表试题(二)

一、移除链表元素

1、题目介绍


2、思路讲解

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


3、代码实现


二、反转链表

1、题目介绍


2、思路讲解

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


3、代码实现


三、相交链表

1、题目介绍


2、思路讲解

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


3、代码实现


四、链表的中间结点

1、题目介绍


2、思路讲解

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


3、代码实现


五、设计循环队列

1、题目介绍


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、题目介绍


2、思路讲解

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

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

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


3、代码实现


目录
相关文章
|
7月前
|
存储 测试技术 C++
二叉树——经典练习题
二叉树——经典练习题
|
7月前
|
存储 测试技术 计算机视觉
栈和队列经典练习题
栈和队列经典练习题
|
6月前
【数据结构】链表经典OJ题,常见几类题型(二)
【数据结构】链表经典OJ题,常见几类题型(二)
23 0
|
6月前
【数据结构】链表经典OJ题,常见几类题型(一)
【数据结构】链表经典OJ题,常见几类题型(一)
30 0
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
7月前
|
算法 索引
链表经典练习题
链表经典练习题
|
7月前
|
Java C++ Python
试题 基础练习 Huffuman树
试题 基础练习 Huffuman树
40 0
|
7月前
|
算法
经典双指针算法试题(二)
经典双指针算法试题(二)
62 0
|
7月前
|
算法 容器
经典双指针算法试题(一)
经典双指针算法试题(一)
61 0
|
7月前
|
C++
C++【二叉树进阶试题】
C++【二叉树进阶试题】
56 0