加载中...

一些递归

反转链表

public:
    ListNode* reverseList(ListNode* head) {
        // 1. 递归终止条件
        if (head == nullptr || head->next == nullptr) return head;//最后一个是p
//注意上面的顺序不能调换!否则报错引用了空指针(head->)当head本身就是空的时候!!
        ListNode* p = reverseList(head->next);
        head->next->next = head;
//head.next.next本来是指向null,,等于的head就是让他在指到反转指回去

        head->next = nullptr;
//再让head下一个变成null指回去null
        return p;//由于这个导致返回的每次返回的是同一个p
//注意这个不是head,如果是head就乱了
    }




删除链表重复的元素

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        head.next = deleteDuplicates(head.next);
        if(head.val == head.next.val) head = head.next;//直接将head变成head->next等效删除
        return head;
    }
}

合并两个升序链表 双90

if(!list1) return list2;
        else if(!list2) return list1;
        
        else if(list1->val<list2->val)
        {
            list1->next=mergeTwoLists(list1->next ,list2);
            return list1;
        }

        else{list2->next=mergeTwoLists(list1 ,list2->next);

                 return list2;
        }  
       

返回链表倒数第k个结点的值

   //全局变量,记录递归往回走的时候访问的结点数量
    int size;

    public int kthToLast(ListNode head, int k) {
        //边界条件判断
        if (head == null)
            return 0;
        int val = kthToLast(head.next, k);
        ++size;
        //从后面数结点数小于k,返回空
        if (size < k) {
            return 0;
        } else if (size == k) {
            //从后面数访问结点等于k,直接返回传递的结点k即可
            return head.val;
        } else {
            //从后面数访问的结点大于k,说明我们已经找到了,
            //直接返回node即可
            return val;
        }
    }

posted @ 2021-11-28 13:20  liang302  阅读(16)  评论(0编辑  收藏  举报