删除链表的倒数第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;
}
};