一、反转链表
原链接:https://leetcode.cn/problems/reverse-linked-list/
思路一:翻指针
- 需要先保存下一个指针,否则翻转后找不到下一个指针
- 迭代到最后那n1就是头
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
// 判断head == NULL,等于空则返回空
if(head == NULL){
return NULL;
}
// 初始条件
struct ListNode* n1 = NULL,*n2 = head,*n3= n2->next;
// 结束条件
while(n2){
// 迭代
n2->next = n1;
n1 = n2;
n2 = n3;
// 如果n3为空了就不
if(n3){
n3 = n3->next;
}
}
// n1 就是最后链表的头
return n1;
}
图解:
**思路二:**头插法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* cur = head;
// 定义新节点
struct ListNode* newHead = NULL;
while(cur){
// 提前保存下一个
struct ListNode* next = cur->next;
// 头插
cur->next = newHead;
newHead = cur;
cur = next;
}
// 最后newhead就是第一个元素
return newHead;
}
图解:
二、链表的中间节点
原链接:https://leetcode.cn/problems/middle-of-the-linked-list/description/
**思路一:**快慢指针
图解:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head) {
struct ListNode* slow = head,*fast = head;
// fast和fast->next都不等于空才结束
while(fast && fast->next){
// slow 走一步
slow = slow->next;
// fast 走两步
fast = fast->next->next;
}
return slow;
}