【Java--数据结构】链表经典OJ题详解(上)
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
谈谈头插、头删、尾插、头插的时间复杂度
反转一个单链表
链表的中间结点
返回倒数第k个结点
合并两个链表
谈谈头插、头删、尾插、头插的时间复杂度
头插和头删的时间复杂度为O(1),
尾插和尾删的时间复杂度为O(n) (因为尾插和尾删要一个个遍历完链表)
反转一个单链表
OJ链接
采用头插法
创建cur指针使得cur=head.next
将head.next置空(作为尾节点)(注意要判断head为空的情况,return head,否则会报空指针异常)
- 创建curN指针使得curN=cur.next
- 让cur.next=head
- head=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.next
- fast=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.next
- count++
这是一个循环,条件是count