一、移除链表元素
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、代码实现