数据结构线性表之链式结构代码及其部分功能实现

代码实现

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一直为空,无法显示数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值