java中單鏈表的操作


1.
1.1 問題描述
單鏈表刪除鏈表中的一個已知節點,要求:時間復雜度O(1)
1.2 解決描述
假如刪除的節點為del,其下一個節點為del.next
將del.next的值給del,刪除del
1.3 需要考慮
<1>當鏈表的長度為1時,返回null;
<2>當del沒有下一個節點時,即要刪除的節點為尾節點,需要依次遍歷找到其前驅節點,然后刪除。
1.4 代碼

package com.test.鏈表;

import com.java.util.LinkedNode;

/**
* @author wangpei
* @version 創建時間:2017年8月24日 下午12:29:28 類說明
*/

public class 時間復雜度為1刪除鏈表 {
public static void main(String[] args) {
LinkedNode head = new LinkedNode(1);
head.next = new LinkedNode(2);
head.next.next = new LinkedNode(3);
head.next.next.next = new LinkedNode(4);
head.next.next.next.next = new LinkedNode(5);
LinkedNode del = head.next;// 要刪除的節點
if (del == head && del.next == null)
return;
delete(head, del);

LinkedNode p = head;
while (p != null) {
System.out.println(p.value + " ");
p = p.next;

}

}

public static void delete(LinkedNode head, LinkedNode del) {
if (head == del && head.next == null) {
head = null;
return;
}

if (del.next != null) {// 不是尾節點
del.value = del.next.value;
del.next = del.next.next;
} else {// 是尾節點
LinkedNode p = head;
while (p.next != del) {
p = p.next;

}
p.next = del.next;

}

}

}

2.
2.1 問題描述:刪除鏈表中的重復節點
2.2 解決描述: 選擇排序的思想,從根節點開始,挨個遍歷鏈表,遇到相同的則刪除
2.3 需要考慮:
2.4 代碼:

2.
2.1 問題描述:刪除鏈表中的重復節點
2.2 解決描述:
2.3 需要考慮:
2.4 代碼:

2.求兩個鏈表的第一個公共節點

package com.test.鏈表;

import com.java.util.LinkedNode;

/**
* @author wangpei
* @version 創建時間:2017年8月24日 下午12:29:09 求倆個鏈表的第一個公共節點
*/

public class 兩個鏈表的第一個公共節點 {
public static void main(String[] args) {
LinkedNode head1 = new LinkedNode(2);
head1.next = new LinkedNode(3);
head1.next.next = new LinkedNode(3);
head1.next.next.next = new LinkedNode(4);
head1.next.next.next.next = new LinkedNode(5);

LinkedNode head2 = new LinkedNode(4);
head2.next = new LinkedNode(5);
// head2.next.next=new LinkedNode(3);
// head2.next.next.next=new LinkedNode(4);
// head2.next.next.next.next=new LinkedNode(5);
System.out.println(getGonggong(head1, head2).value);

}

public static LinkedNode getGonggong(LinkedNode head1, LinkedNode head2) {
int i1 = 0;
int i2 = 0;
LinkedNode p1 = head1;
LinkedNode p2 = head2;

while (p1 != null) {
i1++;
p1 = p1.next;
}

while (p2 != null) {
i2++;
p2 = p2.next;
}
p1 = head1;
p2 = head2;
if (i1 > i2) {
for (int i = 0; i < i1 - i2; i++) {
p1 = p1.next;

}
} else{
for (int i = 0; i < i1 - i2; i++) {
p2 = p2.next;

}
}
while (p1 != null && p2 != null) {
if (p1.value == p2.value)
return p1;
else {
p1 = p1.next;
p2 = p2.next;
}
}

return null;

}

}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com