算法基础题day1

solution:

书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个书单链表。(无头结点)

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/7fmls1/

题解:让原链表直接进行原地反转,但是占用内存还是这么多,只是创建了一个数组因为他是要返回数组

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    public int[] reverseBookList(ListNode head) {

      //法一,直接在原链表上进行修改

      ListNode pre=null,list=head;

      int a[];

      int n=0;//记录链表个数

     while(list!=null)

     {

         n++;

     ListNode node=list.next;//保存他的下一个链表节点      

     list.next=pre;

     pre=list;

     list=node;

     }

     a=new int[n];

     int i=0;

     while(pre!=null)

     {

     a[i++]=pre.val;

     pre=pre.next;    

     }

     return a;

    }

}

 //法二:先算出链表有多长,再创建一个数组,从后往前遍历

    int n=0;

    ListNode list=head,p=list;

    while(list!=null)

    {

      list=list.next;

      n++;

    }

    int[] a=new int[n];

     for(;n>0;n--)

     {

         a[n-1]=p.val;

         p=p.next;

     }

     return a;

    }

发现消耗的内存更大了,这一种方法和上面方法都差不多,创建了一个数组,没有在本质上解决问题,可是我看别人解析和我的也差不多我的内存这么大,可恶!!!!!!

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

示例 1:

输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:

输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/7fmls1/
 

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int x) { val = x; }

 * }

 */

class Solution {

    public ListNode deleteNode(ListNode head, int val) {

    //定义一个前向指针和一个当前指针即可解决,本题若没有头节点如果删除的是第一个节点需要特殊处理

    ListNode pre=null,p=head;

    while(p!=null)

    {

       if(p==head&&p.val==val){//删除第一个节点

       p=p.next;

       head=p;

       break;//若是第一个节点则需直接返回就可

       }

        

       if(p.val==val){

           pre.next=p.next;

           break;

       }

     pre=p;

      p=p.next;

    }

    return head;

    }

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值