作者:渴望力量的土狗
博客主页:渴望力量的土狗的博客主页
专栏:手把手带你刷牛客
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
目录
描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
- 示例1
- 输入:
- {1,2,3}
- 返回值:
- {3,2,1}
-
-
-
- 示例2
- 输入:
- {}
- 返回值:
- {}
- 说明:
- 空链表则输出空
思路描述:为了反转链表,简单一点说就是把结点的next值进行一个修改,如果我们用cur来记录当前的结点,那么在修改指向的时候,我们需要知道它的前一个结点(pre)和后一个结点(curNext),因为一旦指向修改完成后,后面的结点就找不到了,所以我们需要记录一下。所以我们首先记录一下当前结点的下一个结点,然后把当前结点cur的next指向pre,让pre后移,也就是pre=cur;然后让cur指向记录的curNext即可,直至遍历完整个链表。
AC代码:
- /*
- public class ListNode {
- int val;
- ListNode next = null;
- ListNode(int val) {
- this.val = val;
- }
- }*/
- public class Solution {
- public ListNode ReverseList(ListNode head) {
-
- ListNode cur=head;
-
- ListNode pre=null;
-
- while(cur!=null){
- ListNode curNext=cur.next;
- cur.next=pre;
- pre=cur;
- cur=curNext;
- }
-
- return pre;
-
- }
- }
描述
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,给出的链表为: 1→2→3→4→5, n=2.
删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5.
数据范围: 链表长度 0≤n≤1000,链表中任意节点的值满足 0≤val≤100
要求:空间复杂度 O(1),时间复杂度O(n)
备注:题目保证 n 一定是有效的
- 示例1
- 输入:
- {1,2},2
-
- 返回值:
- {2}
思路描述:首先要判空,否则就没有必要进行下去了。删除链表中结点的操作就比较简单,直接让该结点的前一个结点的next指向该结点的后一个结点即可。本题的关键在于如何找到这个结点,由于是倒数的,所以我们要算出该链表的长度,就写个size函数即可。然后把倒数转化为正着数即可,定义一个newSize=size(head)- n;即可得到正着的结点位置,然后进行删除操作即可!
AC代码:
- import java.util.*;
-
- /*
- * public class ListNode {
- * int val;
- * ListNode next = null;
- * }
- */
-
- public class Solution {
- /**
- *
- * @param head ListNode类
- * @param n int整型
- * @return ListNode类
- */
- public ListNode removeNthFromEnd (ListNode head, int n) {
- if(head==null){
- return null;
- }
- ListNode cur=head;
- ListNode pre =null;
- int newSize=size(head)-n;
- while(cur!=null&&newSize!=0){
- pre=cur;
- cur=cur.next;
- newSize--;
- }
- if(cur!=head){
- pre.next=cur.next;
- }else{
- head=cur.next;
- }
-
-
- return head;
-
- }
- public int size(ListNode head){
- int size=0;
- ListNode cur=head;
- while(cur!=null){
- cur=cur.next;
- size++;
- }
- return size;
- }
- }
描述
给定一个链表,请判断该链表是否为回文结构。
回文是指该字符串正序逆序完全一致。
数据范围: 链表节点数 0≤n≤10^5,链表中每个节点的值满足 ∣val∣≤10^7
- 示例1
- 输入:
- {1}
-
- 返回值:
- true
-
- 示例2
- 输入:
- {2,1}
-
- 返回值:
- false
-
- 说明:
- 2->1
- 示例3
- 输入:
- {1,2,2,1}
-
- 返回值:
- true
-
- 说明:
- 1->2->2->1
思路描述:回文数我们见的多了,对于链表,我们想知道是不是回文数,经常使用双指针来解决。这题的关键在于找到中间结点,然后将中间结点后面的结点进行反转,反转完了之后分别从两端开始进行比较,直到出现不相等为止,如果没有不相等的,就是回文,有不相等的就不是回文。主要思想就是定义一个快指针,一个慢指针,快的一次走两步,慢的一次走一步,当快的走到链表的尾结点的时候,慢的就是中间结点的位置,然后把它后面的结点进行反转,上面说过怎么反转了,最后,从两端开始比较即可!
AC代码:
- import java.util.*;
-
- /*
- * public class ListNode {
- * int val;
- * ListNode next = null;
- * }
- */
-
- public class Solution {
- /**
- *
- * @param head ListNode类 the head
- * @return bool布尔型
- */
- public boolean isPail (ListNode head) {
- // write code here
- if(head==null){
- return true;
- }
- if(head.next==null){
- return true;
- }
-
-
- ListNode slow=head;
- ListNode fast=head;
-
- while(fast!=null&&fast.next!=null){
-
- fast=fast.next.next;
- slow=slow.next;
-
- }
-
- ListNode cur=slow.next;
- while(cur!=null){
-
- ListNode curNext=cur.next;
- cur.next=slow;
- slow=cur;
- cur=curNext;
- }
-
- while(head!=slow){
- if(head.val!=slow.val){
- return false;
- }
- if(head.next==slow){
- return true;
- }
- head=head.next;
- slow=slow.next;
- }
- return true;
- }
- }
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!