package com.areio.offer;
//结点
public class Node {
//当前结点的值
int val;
//下一个结点
Node next;
public Node(){}
public Node(int val){
this.val=val;
}
public Node(int val, Node next){
this.val=val;
this.next=next;
}
@Override
public String toString() {
return "Node{" +
"val=" + val +
", next=" + next +
'}';
}
}
package com.areio.offer;
public class _6A_LinkList {
//注意java是值传递,head作为形参,改变形参引用的地址,实参是不会跟着变的,仍然指向一开始的头结点所在地址。所以head不要做形参,做成员变量
private Node head;
public _6A_LinkList(){}
public Node getHead(){
return this.head;
}
/*
* 向链表的最后插入一个值为val的结点
*
* val是待插入结点的值
*
* */
public void insertToLast(int val){
//1、如果链表为空,待插入结点成为头结点;否则待插入结点是尾结点
//创建新结点
Node newNode=new Node(val,null);
//创建一个指针p,代表当前遍历结点的位置,初始化指向头结点的位置,当其到达空位置,新节点此时可插入
//p是头结点对象的引用,head需要是成员变量;
// 如果是形参传进来,那么一旦形参head改变,实参head指向的地址却没变
Node p=head;
if (head==null){
head=newNode;
return;
}
while (p.next!=null){
p=p.next;
}
//此时p.next==null,此时p是最后一个结点的引用,它的成员属性next修改,对象也会修改
p.next=newNode;
}
/*
* 查出头结点为head的链表中第一个值为val的结点,并删除该结点
* head不作为形参,因为一旦key是头结点,那么形参head指向新结点的地址,而实参head扔指向原来的结点
* */
public void findOneAndDel(int key){
//1、原链表为空,直接返回null
//2、第一个值为val的结点是头结点,那么head=head.next;如果不是头结点,是p.next,则p.next=p.next.next
//原链表为空
if (head==null){
return;
}
//值key在头结点
if (head.val==key){
head=head.next;
return;
}
//p表示当前访问结点,从头结点开始访问
Node p=head;
//值key不在头结点
while (p.next!=null&&p.next.val!=key){//如果链表没有这个结点,它会遍历到p=null 那么p.next 相当于null.next
p=p.next;
}
//到这说明要么p.next.val==key,要么p.next==null
if (p.next==null){
//必须先判断是不是p.next==null,如果先判断p.next.val,则可能导致null.val
//如果是p.next==null则什么都不用做
return;
}
//到这说明p.next.val==key
p.next=p.next.next;
}
//创建单链表
public void createLinkedList(int[] nums){
for (int i=0;i<nums.length;i++){
insertToLast(nums[i]);
}
}
//遍历链表
public void printList(Node head){
Node p=head;
while (p!=null){
System.out.print(p.val+" ");
p=p.next;
}
System.out.println();
}
}
package com.areio.offer;
public class _6A_Test {
public static void main(String[] args) {
_6A_LinkList linkList=new _6A_LinkList();
//创建一个链表,此时头结点肯定是空的,所以在创建链表的时候需要考虑到
int[] nums=new int[]{4,8,8,6,7};
linkList.createLinkedList(nums);
linkList.printList(linkList.getHead());
linkList.findOneAndDel(4);
linkList.printList(linkList.getHead());
linkList.insertToLast(9);
linkList.printList(linkList.getHead());
linkList.findOneAndDel(8);
linkList.printList(linkList.getHead());
linkList.insertToLast(4);
linkList.printList(linkList.getHead());
}
}