目录
上一篇文章我们介绍了单链表的一些简单方法
接下来我们继续了解单链表的其他护基础方法
插入节点操作
public static boolean insertListNode(ListNode list, int index, int val){ //index为索引,val为插入的元素 ListNode p=list; int count=1;//定义开始查找的节点为第一个节点 while(p.next!=null){ if(count==index) { ListNode newNode = new ListNode(val); newNode.next=p.next; p.next=newNode; return true; }else{ p=p.next; count++; } } return false; }
插入节点的核心就是移动插入的元素的节点和插入索引位置的前一个位置的节点的next指针,将这两个指针重新指向相应的节点
同插入算法一样,该算法的主要事件也是耗费在查找操作上,时间复杂度为O(n)。上面的代码遇到插入尾节点时,不能插入成功,因为最后一次循环p.next为null,看到这里我相信你们已经可以自己进行小优化一下,加一个if判断就好了
删除节点操作
public static boolean deleteListNode(ListNode list, int index){ //index为索引 ListNode p=list; int count=1;//定义开始查找的节点为第一个节点 while(p.next!=null){ if(count==index) { p.next = p.next.next; return true; }else{ p=p.next; count++; } } return false; }
同理,删除节点也是移动指针,比插入节点更好理接
下面介绍头插法操作与尾插法操作
头插法
该方法从一个空表开始,生成新的节点,并将读到的数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头,即头结点之后
public static ListNode insertListNodeByHead(ListNode list, int val){
ListNode p=list;
ListNode newNode=new ListNode(val);
newNode.next=p.next;
p.next=newNode;
return list;
}
需要注意的是,头插法生成的链表中节点的次序和输入数据的顺序不一致,若希望两者一致,则可以采用尾插法,该方法将新的节点插到当前链表的保卫
尾插法
public static ListNode insertListNodeByTail(ListNode list, int val){ ListNode p=list; while(p.next!=null) { p = p.next;//循环到最后一个节点位置 } ListNode newNode = new ListNode(val); p.next=newNode; return list; }
单链表的基本内容已经说完,我们可以做两道题练练手
反转链表习题
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
public ListNode ReverseList (ListNode head) {
if(head==null){
return head;
}
ListNode cur=head;
ListNode pre=null;
while(cur!=null){
ListNode temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
return pre;
}
}
本题的主要解法就是将一个个链表节点进行破坏,利用双指针,原本正着的链表我们需要反着,快慢指针先进行断节点重塑,接着再继续往后走,一直当指针走到链表末尾位置
合并两个排序的链表
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ public ListNode Merge (ListNode ph1, ListNode ph2) { if(ph1==null){ return ph2; } if(ph2==null){ return ph1; } ListNode list=new ListNode(0);//进行赋值操作 ListNode p=list; while(ph1!=null&&ph2!=null){ if(ph1.val<ph2.val){ p.next=ph1; ph1=ph1.next; }else{ p.next=ph2; ph2=ph2.next; } p=p.next; } if(ph1==null){ p.next=ph2; } if(ph2==null){ p.next=ph1; } return list.next; } }
内容如有错误或者不合适的地方,欢迎大家多多指出,我会迅速修改,谢谢