文章目录
- 一、移除链表元素
- 1、题目介绍
- 2、思路讲解
- 3、代码实现
- 二、反转链表
- 1、题目介绍
- 2、思路讲解
- 3、代码实现
- 三、相交链表
- 1、题目介绍
- 2、思路讲解
- 3、代码实现
- 四、链表的中间结点
- 1、题目介绍
- 2、思路讲解
- 3、代码实现
- 五、设计循环队列
- 1、题目介绍
- 2、思路讲解
- 3、代码实现
- 六、两两交换链表中的节点
- 1、题目介绍
- 2、思路讲解
- 3、代码实现
一、移除链表元素
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;elsereturn obj->a[obj->front];}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->rear+obj->k)%(obj->k+1)];}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}
六、两两交换链表中的节点
1、题目介绍
2、思路讲解
可以通过递归的方式实现两两交换链表中的节点。
递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。
如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。