day3.

 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的方程

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值