203.移除链表元素
malloc语句还是不熟练示例里面喜欢直接用ListNode* A而我之前都是ListNode* List,List A。不知道还可以这样,而且只用利用单一个temp的话可以直接ListNode* temp不用重新malloc一个单元。
707.设计链表
定义节点要记忆一下
typedef struct MyLinkedList{
int val;
struct MyLinkedList* next;
} MyLinkedList;
临时节点就是MyLinkedList* temp;
创建新节点加入节点 MyLinkedList* A = (MyLinkedList*)malloc(sizeof(struct MyLinkedList));
AddAtIndex 0和后面的必须拆开不然只能过一半
206.反转链表
一个pre和一个tmp从头到尾一个一个反转,pre和tmp隔一个依次移动,递归也是从前到后依次反转,
class Solution {
public:
ListNode* reverse(ListNode* pre,ListNode* cur){
if(cur == NULL) return pre;
ListNode* temp = cur->next;
cur->next = pre;
// 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
// pre = cur;
// cur = temp;
return reverse(cur,temp);
}
ListNode* reverseList(ListNode* head) {
// 和双指针法初始化是一样的逻辑
// ListNode* cur = head;
// ListNode* pre = NULL;
return reverse(NULL, head);
}
};
重新创造一个函数模拟每一次从前到后的单次迭代双指针传递,因为是双指针所以得重新创造一个二元的函数,来完成递归
但还有一个反向从后到前的递归,
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// 边缘条件判断
if(head == NULL) return NULL;
if (head->next == NULL) return head;
// 递归调用,翻转第二个节点开始往后的链表
ListNode *last = reverseList(head->next);
// 翻转头节点与第二个节点的指向
head->next->next = head;
// 此时的 head 节点为尾节点,next 需要指向 NULL
head->next = NULL;
return last;
}
};
1.Last找到之后一路传递出来作为答案2.依次翻转从里到外
数组的总结
双指针可以看作一个主要指针对应for循环里面的int i,另一个副功能指针是关于i的方程