代码实现
package 线性表单链表结构及功能实现;
/*程序最大的好处 在于从链表类中创建了一个结点内部类,创建嵌套类的对象 不需要对象名 直接使用.next
*
* 程序仍可改进点:程序虽然存在头指针了,但我们仍可以申请一个空节点始终作为程序的第一个节点,这样能够
* 使得程序在插入 与 删除等操作时 第一节点 与其他节点操作保持一致。减少代码量。
*
*
*/
public class LinkedList {//补充链表更新数值的功能
static class ListNode{
int val;//数据域
ListNode next;//指针域
public ListNode(int val) {
this.val=val;
}
}
ListNode head;//头指针
ListNode tail;//尾指针
int size;//链表长度
public LinkedList() {//头指针和尾指针 只起到一个指示作用 不用分配内存空间。
head=null;
tail=null;
size=0;
}
public static void main(String args[]) {
LinkedList list=new LinkedList();
list.append1(3);
list.display();
list.append1(4);
list.display();
list.append2(5);
list.display();
list.update(1,7);
list.display();
}
//插入结点(位置,值)
public void insert(int position,int num) {
if(position>size) {
return ;
}
ListNode newNode=new ListNode(num);
if(position==0) {
newNode.next=head;
head=newNode;
size++;
}
else if(position==size) {
this.append1(num);
}
else {
ListNode pre=head;
for(int i=0;i<position-1;i++) {
pre=pre.next;
}
ListNode now=pre.next;
newNode.next=now;
now=newNode;
size++;
}
}
//打印结点
public void display() {
ListNode cur=head;
while(cur!=null) {
System.out.print(cur.val+" ");
cur=cur.next;
}
System.out.println();
}
//删除结点:删除结点的前一个结点的指针指向删除结点的下一个结点
public void delete(int num) {
if(head!=null&&head.val==num) {
head=head.next;
size--;
}
if(size==0) {//把仅有的一个结点删掉 尾结点也需要更新
tail=head;
}
else {
ListNode pre=head;
ListNode cur=head;
while(pre!=null&&cur!=null) {
if(cur.val==num) {
if(cur==tail) {
tail=pre;
}
pre.next=cur.next;
size--;
return;
}
pre=cur;
cur=cur.next;
}
}
}
//查找 返回位置
public int search(int num) {
ListNode cur=head;
for(int i=0;cur!=null;i++) {
if(cur.val==num) {
return i;
}
cur=cur.next;
}
return -1;
}
//新增元素在末尾(尾插法)
public void append1(int num) {
ListNode newNode=new ListNode(num);
if(tail==null) {//还没有元素时执行
head=newNode;
tail=newNode;
}
else {
tail.next=newNode;
tail=newNode;
}
size++;
}
//新增元素在头(头插法)
public void append2(int num) {
ListNode newNode=new ListNode(num);
if(head==null) {
head=newNode;
tail=newNode;
}
else {
newNode.next=head;
head=newNode;
}
size++;
}
//更新链表中元素的数据域(元素位置,更改数值)
public void update(int position,int num) {
int length=0;
ListNode newNode=head;
if(position>size) {
System.out.println("超出范围");
}
while(newNode!=null) {
if(length==position) {
newNode.val=num;
System.out.println("修改成功");
}
newNode=newNode.next;
length++;
}
}
}
测试的时候发现使用两个append方法首次添加数据的时候,display始终不能显示数据,后来发现在首次添加数据时要给head指针赋值,不然会使得display方法中的head一直为空,无法显示数据。