节点的定义
public class ListNode {
int val; //链表的元素值
ListNode next; //下一个节点的位置
ListNode(int x) { val = x; }
}
链表的查找操作
//按值查找
public ListNode ListFind(int x,ListNode PtrL){
ListNode p=PtrL;
while (p!=null&&p.val!=x) p=p.next;
return p;
}
//按序号查找
public ListNode ListFindKth(int k,ListNode PtrL){
ListNode p=PtrL;
int i=1;
while (p!=null&&i<k){
p=p.next;
i++;
}
if (i==k) return p;
return null;
}
链表的插入操作
顺序一定不能反掉,一定要先将s指向p的下个节点,再将p的下一个节点指向s
//链表的插入操作
public ListNode ListInsert(int x,int i,ListNode PtrL){
ListNode p=PtrL,s=PtrL;
//插入到头结点
if (i==1){
s.val=x;
s.next=PtrL;
}
p=ListFindKth(i-1,PtrL); //查找第i-1个节点
if (p==null) return null; //不存在的情况下
//存在的情况下
s.val=x;
s.next=p.next; //新结点 指向p的下一个节点
p.next=s; //再将p指向s
return PtrL;
}
链表的删除操作
//链表的删除操作
public ListNode ListDelete(int i,ListNode PtrL){
ListNode p=PtrL,s=PtrL;
if (i==1){
if (PtrL!=null) return PtrL.next;
return null;
}
p=ListFindKth(i-1,PtrL); //查找第i-1个节点
if (p==null||p.next==null) return null;
p.next=p.next.next;
return PtrL;
}
链表的反转
方法一:
栈的思想:
先压栈再弹出即可
ListNode p; //反转链表q
ListNode q = new ListNode(-1),tmp=q;
Stack<ListNode> nodes = new Stack<>();
while (p!=null) nodes.push(p);
while (!nodes.isEmpty()){
tmp.next=nodes.pop();
tmp=tmp.next;
}
return q.next;