就地逆置——头插法
有一个线性表采用带头节点的单链表存储,采用就地算法将其就地逆置。
思路:
使用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();
}