当前位置:首页 » 《资源分享》 » 正文

【Java--数据结构】链表经典OJ题详解(上)

17 人参与  2024年04月28日 10:40  分类 : 《资源分享》  评论

点击全文阅读


欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

谈谈头插、头删、尾插、头插的时间复杂度

反转一个单链表 

链表的中间结点

返回倒数第k个结点

合并两个链表


谈谈头插、头删、尾插、头插的时间复杂度

头插和头删的时间复杂度为O(1),

尾插和尾删的时间复杂度为O(n) (因为尾插和尾删要一个个遍历完链表)

反转一个单链表 

OJ链接

采用头插法

创建cur指针使得cur=head.next

将head.next置空(作为尾节点)(注意要判断head为空的情况,return head,否则会报空指针异常)

创建curN指针使得curN=cur.next让cur.next=headhead=cur

1~3步是一个循环,进入循环条件是cur!=null(即当cur为空时,代表cur已经遍历完链表)

class Solution {    public ListNode reverseList(ListNode head) {        if(head==null){            return head;        }        //正常情况        ListNode cur=head.next;        head.next=null;        while(cur!=null){            ListNode curN=cur.next;            cur.next=head;            head=cur;            cur=curN;        }        return head;    }}

链表的中间结点

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结 点。OJ链接

 快慢指针法

定义一个慢指针slow(每次走一步),一个快指针fast(每次走两步)

即slow=slow.nextfast=fast.next.next

这是一个循环,进入循环的条件为fast!=null&&fast.next!=null(这两个条件不可以交换,否则当fast=null时,先判断fast.next!=null时,会出现空指针异常)

fast!=null针对的是链表长度是数的情况

fast.next!=null针对的是链表长度是数的情况

class Solution {    public ListNode middleNode(ListNode head) {        ListNode slow=head;        ListNode fast=head;        while(fast!=null&&fast.next!=null){            slow=slow.next;            fast=fast.next.next;        }        return slow;    }}

返回倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。OJ链接

 定义两个节点fast和slow,先让fast走k步,再让fast和slow一起走,当fast走完链表时,此时slow的位置就是倒数第k个节点。(fast和slow之间的距离就是k,当fast走到null时,返回slow.val)

 

fast先走k步,用count计数,

fast=fast.nextcount++

这是一个循环,条件是count<k(count是从0开始的,所以count<k 就是让fast走了k 步)

接着让fast和slow一起走,进入循环条件是fast!=null

fast=fast.nextslow=slow.next
class Solution {    public int kthToLast(ListNode head, int k) {        ListNode fast=head;        ListNode slow =head;        int count=0;        while(count<k){            fast=fast.next;            count++;        }        while(fast!=null){            fast=fast.next;            slow=slow.next;        }        return slow.val;    }}

合并两个链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。OJ 链接

定义一个哨兵位节点newH,遍历节点tmp

比较A和B链表的值,谁小,就将谁的节点放入新链表中

若A的值小( B同理)

tmp.next=headA;headA=headA.next;tmp=tmp.next;

这是一个循环,进入循环条件是headA!=null&&headB!=null(只要有一个链表遍历完了,就跳出循环)

还要判断A走完,B还有的情况(headA=null),(反之同理)

tmp.next=headB;

class Solution {    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {        ListNode headH=new ListNode();        ListNode cur=headH;                while(list1!=null&&list2!=null){            if(list1.val<list2.val){                             cur.next=list1;                list1=list1.next;                cur=cur.next;                    }            else{                cur.next=list2;                list2=list2.next;                cur=cur.next;            }                }        if(list1==null){            cur.next=list2;        }        if(list2==null){            cur.next=list1;        }        return headH.next;    }}


点击全文阅读


本文链接:http://zhangshiyu.com/post/101405.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1