链表简单操作

[color=green]链表:是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,
而是在每一个节点里存到下一个节点的信息(相当与C++的指针)。

链表的主要操作:增,删,查,改,其它。

1.增加一个链表元素:

/**
* 加入链表元素,加到尾部
*/
public void add(Object obj) {
Node node = new Node(obj);
if (head == null) {
head = node;
} else {
last.next = node;
}
last = node;
}

2.删除一个链表元素 :

/**
* 删除第一个出现链表元素的node.obj=obj
*/
public void delete(Object obj) {
Node node = head;
Node node1 = null;
while (node != null && !node.obj.equals(obj)) {
node1 = node;
node = node.next;
}

System.out.println("node.obj= " + node.obj);
if (node == null) {
System.out.println("找不到所要删除的元素");
} else {
if (node1 != null) {
node1.next = node.next;
} else {
head = node.next;
}
}
}

3.修改一个链表元素

/**
* 修改下标的index的元素,从0开始
*/
public void modify(int index, Object obj) {
Node node;
node = head;
for (int i = 0; i < index && node != null; i++) {
node = node.next;
}
if (node == null) {
System.out.println("找不到所要修改的元素");
} else {
node.obj = obj;
}
}

4.查找一个链表元素:

/**
* 查找第一个出现链表元素的node.obj=obj
*/
public int find(Object obj) {
Node node = head;
int index = 0;
while (node != null && !node.obj.equals(obj)) {
index++;
node = node.next;
}

if (node == null) {
System.out.println("找不到所要查找的元素");
return -1;
} else {
return index;
}
}


5.约瑟夫问题:

/**
* 约瑟夫问题
*/
public Node yueSeFu(int n,int k,int m){
Node head1=null;
Node front=null;
list1=new List();
for(int i=0;i<n;i++){
list1.add(""+(i+1));
}
int index=0;
list1.last.next=list1.head;//不要错指head(都是粗心惹的祸)
Node node = list1.head;
if(k==1){
front=list1.last;
}else{
while (node != null) {
index++;
if(index==k-1){
front=node;
break;
}
node = node.next;
}

}
// head1=front.next;
System.out.println("aaaaaaaafront.obj= "+front.obj);
index=1;
node = head1;
while (true) {
if(index==m){
index=0;
n--;
// System.out.println("删除 "+front.next.obj);
front.next=front.next.next;
}else{
front=front.next;
}
index++;
if(n==1){
break;
}
}
return front;
}

6.链表是否相交:

/**
* 判断两个链表是否相交
*/
public boolean isJiao(List list1){
Node head1=list1.head;
Node node = head;
while (node != null) {
Node node1=head1;
while(node1!=null){
if(node1.equals(node)){
System.out.println("node.obj= "+node.obj);
return true;
}
node1=node1.next;
}
node = node.next;
}
return false;
}

7.链表是否是环状:

/**
* 判断链表是否有环
*/
public Node isCircle(){
Node node = head;
int index=0;
while (node != null) {
node = node.next;
Node node1=head;
int i=0;
while(i<index){
if(node1.equals(node)){
return node1;
}
node1=node1.next;
i++;
}
index++;
}
return null;
}

8.链表逆置:

/**
* 对链表逆置(用头插法建一个链表)
*/
public void nizhi() {
Node head1 = new Node(head.obj);
Node node1 = new Node(head.obj);
Node node = head;
while (node != null) {
Object obj = node.obj;
node1 = new Node(obj);
node1.next = head1;
head1 = node1;
System.out.println("obj = " + node.obj);
node = node.next;
}
head = node1;
}

9.链表排序:

/**
* 对链表进行排序(这个只是一个值排序,结点排序还有问题)
*/
public void sort(){
Node node=head;
while(node!=null){
Node node1=node.next;
while( node1!=null ){
if( Integer.parseInt((String)node.obj) > Integer.parseInt((String)node1.obj) ){
Object obj=node1.obj;
node1.obj=node.obj;
node.obj=obj;
}
node1=node1.next;
}
node=node.next;
}
}

感想:链表的操作会经常指向同一段内存,以至可能会出现node的next会出现乱指的问题,
我也遇到了好多这样的问题,所以一定当指向一段内存时,一定要仔细点。最好是画
图,这样思绪才会更清晰。[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值