赞
踩
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
头插和头删的时间复杂度为O(1),
尾插和尾删的时间复杂度为O(n) (因为尾插和尾删要一个个遍历完链表)
采用头插法
创建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个结点。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<k(count是从0开始的,所以count<k 就是让fast走了k 步)
接着让fast和slow一起走,进入循环条件是fast!=null
- fast=fast.next
- slow=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;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。