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;
}
}