链表相关操作
1.删除指定节点,时间复杂度为O(1)
问题描述:删除链表指定的节点,链表如下:
1->2->3->4>5;
删除第三个节点:
1->2->4->5;
问题分析:
删除指定位置的节点,时间复杂度不超过O(1),将指定节点的下一个节点的值覆盖掉指定节点的值,然后再将这指定节点的next指向它的next的next。
代码实现:
节点实现:
public class List {
public int value;
public List next=null;
public List(int value)
{
this.value = value;
this.next =null;
}
}
创建链表:
public static List ListCreat(String list) {
list.trim();
if(list.length()==0)
return null;
String[] value =list.split(",");
String item = value[0];
List phead = new List(Integer.parseInt(item));
List p = phead;
for(int i = 1;i < value.length;i++){
List q = new List(Integer.parseInt(value[i]));
p.next = q;
p = p.next;
}
return phead;
}
删除操作:
public static void delete(int i,List head)//链表删除
{
List p = head;
for(int j=1;j<i;j++) {
p = p.next;
}
if(p.next==null)
{
p=p.next;
}
else {
p.value = p.next.value;
p.next = p.next.next;
}
}
2.链表逆置
问题描述:
将链表就地逆置
问题分析:
定义三个指针,一个是头指针head,一个指针q指null,另一个指针p指向头指针的下一个节点。q指针一开始指null是为了方便后续操作。操作过程中不要将链表的位置信息丢失。
代码实现:
public static List inverion(List head) {//链表反转
List q = null;
List p = head.next;
head.next = q;
while(p!=null) {
q = p;
p = p.next;
q.next = head;
head = q;
}
return head;
}
3.判断是否为回文链表
问题分析:
利用栈的存储结构可以实现。判断出栈的节点的value是否与遍历链表的值一一对应。
代码实现:
public static void Palindrome(List head) {//回文判断
Stack<List> stack = new <List>Stack();
List p = head;
while(p!=null) {
stack.push(p);
p = p.next;
}
int flag = 0;
List t = head;
while(t!=null) {
List q = stack.pop();
if(q.value!=t.value) {
flag = 1;
}
t = t.next;
}
if(flag == 1)
{
System.out.println("NO");
}else {
System.out.println("Yes");
}
}
4 判断链表里是否存在环
问题分析:
定义两个指针,一个指针p1的步长为2,另一个p2步长为1,如果链表中存在环,则两个指针一定会相遇。相遇时结束循环,若不存在环,则循环结束的条件是p1或p2为空的时候。
代码实现:
public static void Circle(List head) {
List p1 = head;
List p2 = head;
int flag = 0;
while(p1!=null&&p2!=null) {
p1 = p1.next;
p2 = p2.next.next;
if(p1==p2) {
flag = 1;
System.out.println("YES");
break;
}
}
if(flag==0)
System.out.println("NO");
}