单链表的应用

就地逆置——头插法

有一个线性表采用带头节点的单链表存储,采用就地算法将其就地逆置。

思路:

使用p指针扫描原单链表,现将头节点的next置为空,然后将其他节点采用头插法插入。

//就地逆置单链表,“就地”的意思是辅助空间为O(1)
	public void reverse(LinkList L){
		Node p=L.head.next;
		Node q;
		L.head.next=null;
		while(p!=null){
			q=p.next;
			p.next=head;
			head=p;
			p=q;
		}
		
	}

将一个线性表拆成两个线性表——尾插法

思路:原链表lc的第一个节点作为la的头节点,第二个节点作为lb的头节点。分别两个链表的尾指针ra,rb,将lc中的奇数序号的节点插入la,偶数序号的节点插入lb

public void spilt(LinkList lc,LinkList la,LinkList lb){
		int i=0;
		la.head=lc.head;
		Node ra=la.head;
		lb.head=lc.head.next;
		Node rb=lb.head;
		Node p=lc.head.next;
		Node q;
		while(p!=null){
			q=p.next;
			if(i%2!=0){
				ra.next=p;
				ra=p;
			}
			else{
				rb.next=p;
				rb=p;
			}
			p=q;
			i++;
		}
		ra.next=null;
		rb.next=null;
		la.showList();
		lb.showList();
	}

对单链表L进行调整,使得所有偶数序号项排在基数序号项之前

思路:通过扫描L的所有节点,将其拆分成两个单链表la和lb,一个用来存放L偶数序号的节点,另一个用来存放L奇数序号的节点,最后将la和lb连接起来。

//将所有偶数项排到奇数项之前
	public void sort(LinkList L){
		LinkList la=new LinkList(); //用来存放所有奇数序号的节点
		LinkList lb=new LinkList(); //用来存放所有偶数序号的节点
		la.head=L.head.next;
		Node ra=la.head;
		lb.head=L.head;
		Node rb=lb.head;
		Node p=L.head;
		Node q;
		int i=0;
		while(p!=null){
			q=p.next;
			if(i%2!=0){
				ra.next=p;
				ra=p;
			}
			else{
				rb.next=p;
				rb=p;
			}
			p=q;
			i++;
		}
		ra.next=null;
		rb.next=la.head;
		lb.showList();
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值