一、反转链表
原链接: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;
}