如果您发现代码有任何问题,请及时留言,或者QQ498442999与我讨论,期待与您一起进步~
//双链表
class DLinkList
{
// 结点类
class Node
{
int data;
Node prior; // 前指针
Node next; // 后指针
Node()
{
}
Node(int data)
{
this.data = data;
}
}
Node first;
Node r;
public DLinkList()
{
first = new Node();
r = first;
}
public DLinkList(int[] a)
{
this();
for (int i = 0; i < a.length; i++)
{
Node n = new Node(a[i]);
r.next = n;
n.prior = r;
r = n;
}
}
// 添加结点,动四根线
public void AddNodeI(int i, int data)
{
if (i <= 0)
{
System.out.println("Error: Out of index");
} else
{
Node current = first;
int j = 0;
while (j < i - 1 && current != null)
{
j++;
current = current.next;
}
if (current == null || current.next == null)
{
System.out.println("Error:Out of index!");
} else
{
Node n = new Node(data);
n.next = current.next;
current.next.prior = n;
n.prior = current;
current.next = n;
}
}
}
// 删除结点,动两根线
public void DeleteNodeI(int i)
{
if (i <= 0)
{
System.out.println("Error:Out of index");
} else
{
Node current = first;
int j = 0;
while (j < i - 1 && current != null)
{
j++;
current = current.next;
}
if (current == null || current.next == null)
{
System.out.println("Error:Out of index");
} else
{
Node currentNext = current.next; // !!!!!!注意,先提出current.next保存到新引用中
if (currentNext.next != null)
{
current.next = currentNext.next;
currentNext.next.prior = current;
} else
{
current.next = null;
currentNext.prior = null;
r = current;
}
}
}
}
// 正向打印链表所有元素
public void DispListF()
{
Node current = first.next;
System.out.print("正向:");
while (current != null)
{
System.out.print(current.data + " ");
current = current.next;
}
System.out.println();
}
// 反向打印链表所有元素
public void DispListR()
{
Node current = r;
System.out.print("反向:");
while (current != null && current != first)
{
System.out.print(current.data + " ");
current = current.prior;
}
System.out.println();
}
}
public class MyDLinkList
{
public static void main(String args[])
{
int[] a =
{ 1, 2, 3, 4, 5 };
System.out.println("实例化链表并赋值数组a={1,2,3,4,5}");
DLinkList dl = new DLinkList(a);
dl.DispListF();
dl.DispListR();
System.out.println("在第3位添加32");
dl.AddNodeI(3, 32);
dl.DispListF();
dl.DispListR();
System.out.println("删除第3位的结点");
dl.DeleteNodeI(3);
dl.DispListF();
dl.DispListR();
}
}
输出:
实例化链表并赋值数组a={1,2,3,4,5}
正向:1 2 3 4 5
反向:5 4 3 2 1
在第3位添加32
正向:1 2 32 3 4 5
反向:5 4 3 32 2 1
删除第3位的结点
正向:1 2 3 4 5
反向:5 4 3 2 1