代码随想录刷题day 3

203. Remove Linked List Elements

不创建dummy 节点的方法: 

当删除节点为头节点时候

ListNode *temp=head; 创建一个temp存储的头结点的位置等下delete释放这部分内存;

head = head->next; //移动头指针的位置到头结点的下一个节点;要注意区分这句与  current->next = current->next->next的区别;

当删除的节点不是头节点的时候

假设删除第n个节点,那么我们的做法是要access n-1个节点并且将n-1 的next 指向n+1, 这样就需要确保删除的节点有前一个节点;

  while(current!=NULL&¤t->next != NULL) //这是因为需要对current进行操作且取current->next的值所以都不能为空,可以指向空指针但是不能操作空指针,这种写法的最后一个元素如果需要删除那么在倒数第二个元素的时候被处理,并且倒数第二个元素直接指向空指针; 这行写反了也不行, 如果写成  while(current->next != NULL && current!=NULL) 那么当链表为空链表的时候会先判断current-> next就直接报错了;

创建dummy 节点的方法:

头指针的位置不能更改,不然直接丢失这个链表的位置; 需要创建一个新的临时current变量来遍历

 ListNode *dummy = new ListNode(-1);

 ListNode *current=dummy;

  dummy->next = head;

707. Design Linked List

这题各种越界;注意index是从0开始的;注意考虑各种边界条件,逻辑很简单。

Get_index()中:

if(index > (_size - 1) || index < 0)   //这里容易出错,不减1的话

add in tail 中: 

while(current->next != NULL){

            current = current->next; 这里要记住如果要access current->next, 要先判断不是空节点;

206. Reverse Linked List

这道题以前做过;核心就是改变next指针的指向;

双指针法: 创建两个指针一个current一个previous; 每次都将current->next 指向previous,然后更新previous和current的位置

递归与双指针法一样,只不过是把 while iterative 改成了recursive

你可能感兴趣的:(数据结构,链表)