LeetCode初级算法

删除链表的倒数第N个节点

对于链表极其不熟悉的我(使用太少了)这题学到很多哈哈哈。

1.  ListNode* dummyHead = new LiseNode(0); //建立一个虚指针,初始值为0

2. 建立不需要链表时记得释放内存空间

3.free和delete的区别:

delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);//建立虚链表结点,初始值为空
        dummyHead -> next = head;
        
        ListNode* quick = dummyHead;
        ListNode* slow = dummyHead;

        n++; //初始位置是head之前
        while(n--) {
            quick = quick -> next;
        }
        while (quick != NULL)
        {
            slow = slow -> next;
            quick = quick -> next;
        }
        ListNode* deleteNode = slow -> next;
        slow -> next = deleteNode -> next;
        delete deleteNode;

        return dummyHead -> next;
    }
};

反转链表

1.要想反转链表,如果拥有链表的pre指针,那很容易做到,而如果题目只给出链表的next指针,那么我们就要去自己定义一个pre指针。依旧使用双指针的思想,对链表实现局部反转。

注意一个点,链表不能断链,取出链表next结点时,需要优先接上next。这也是一开始最让我混淆的地方,首先定义pre为NULL,curr 为 head,因为pre我们要返回的链表的末尾结点的值,应该为空。当temp = curr -> next (2);时,curr -> next 结点接上 pre (NULL)结点, 然后再去修改pre = curr; (1)和curr = temp; (2)结点。此时可以看出,我们把2接到了1的后面。并且pre变成了1,curr变成2,都顺序往后移动了。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *pre = NULL;
        ListNode *curr = head;
        while(curr != NULL) {
            ListNode *temp = curr -> next;
            curr -> next = pre;
            pre = curr;
            curr = temp;
        }
        return pre;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值