创建一条循环双链表

package DataStructureTestSinglyLinkedList;

import DataStructureTest.LList;


public class CirDoublyLinkedList<T> implements LList<T> {

	public DLinkNode<T> head;
	
	public CirDoublyLinkedList()
	{
		this.head.next=this.head;
	}
	public boolean isEmpty() {
		return this.head.next==null;
		
	}

	@Override
	public int length() {
		// TODO 自动生成的方法存根
		
		DLinkNode<T> p = this.head.next;
		int n=0;
		while(p.next!=this.head)
		{
			n++;
			p=p.next;
		}
		return n;
	}

	@Override
	public T get(int i) {
		// TODO 自动生成的方法存根
		if(i>=0)
		{
			DLinkNode<T> p= this.head.next;
			for(int j=0;p.next!=this.head&&j<i;j++)
			{
				p=p.next;
			}
			if(p.next!=this.head)
				return p.next.data;
		}
		
		
		return null;
	}

	public void set(int i, T x) {
		// TODO 自动生成的方法存根
		if(x==null)
			return;
		if(i>=0)
		{
			DLinkNode<T>p=this.head;
			for(int j=0;p.next!=this.head&&j<i;j++)
				p=p.next;
			if(p.next!=head)
			{
				DLinkNode<T> q =new  DLinkNode<T>  ( x,p,p.next);
				p.next.prev=q;
				p.next=q;
			}
		}
		return;
	}

	@Override
	public void insert(int i, T x) {
		// TODO 自动生成的方法存根
		if(x==null)
			return;
		if(i>=0)
		{
			DLinkNode<T> p =this.head;
			for(int j=0;p.next!=this.head&&j<i;j++)
			{
				p=p.next;
			}
		
			DLinkNode<T> q = new DLinkNode<T>(x,p,p.next);
			p.next.prev=q;
			p.next=q;
						
			
		}
		return;
	}

	@Override
	public void append(T x) {
		// TODO 自动生成的方法存根
		if(x==null)
			return;
		DLinkNode<T>q= new DLinkNode<T>(x,this.head.prev,this.head);
		this.head.prev.next=q;
		this.head.prev=q;
		
				
	}

	@Override
	public T remove(int i) {
		// TODO 自动生成的方法存根
		if(i>=0)
		{
			DLinkNode<T> p= this.head.next;
			for(int j=0;p.next!=this.head&&j<i;j++)
			{
				p=p.next;
			}
			if(p!=head)
			{
				T old=p.next.data;
				p.next=p.next.next;
				p.next.prev=p;
				return old;
			}
		}
		return null;
	}

	@Override
	public void removeAll() {
		// TODO 自动生成的方法存根
		this.head.next=this.head;
		this.head.prev=this.head;
	}

	@Override
	public T search(Object key) {
		// TODO 自动生成的方法存根
		
		return null;
	}
			
}

### 循环双链表删除节点的操作 在循环双链表中,删除指定节点是一个常见的操作。以下是关于如何实现这一功能的具体方法。 #### 节点定义 首先需要定义一个节点类来表示循环双链表中的每一个节点。通常情况下,该节点会包含三个部分:存储的数据、指向下一个节点的指针以及指向上一个节点的指针[^1]。 ```cpp struct Node { int data; // 存储的数据 Node* next; // 指向下一个节点 Node* prev; // 指向前一个节点 }; ``` #### 删除节点逻辑 要从循环双链表中删除某个特定节点 `p`,需执行以下操作: 1. **更新前驱节点** 将当前节点 `p` 的前驱节点 (`prev`) 的 `next` 指针重新指向其后继节点 (`next`)。 2. **更新后继节点** 同样地,将当前节点 `p` 的后继节点 (`next`) 的 `prev` 指针重新指向其前驱节点 (`prev`)。 3. **释放内存资源** 如果使用动态分配的方式创建了节点,则需要显式释放被删除节点占用的空间以防止内存泄漏。 具体代码如下所示: ```cpp void deleteNode(Node*& head, Node* p) { if (head == nullptr || p == nullptr) return; // 当只有一个节点时的情况特殊处理 if (p->next == p && p->prev == p) { head = nullptr; delete p; return; } // 更新前后节点的关系 p->prev->next = p->next; // 修改前驱节点的next指针 p->next->prev = p->prev; // 修改后继节点的prev指针 // 若删除的是头节点则调整头部指针位置 if (head == p) head = p->next; // 清理掉待删节点并释放内存 delete p; } ``` 以上实现了通用版本下的任意节点移除过程[^2]。需要注意一点,在实际应用过程中可能还会遇到更多细节问题比如边界条件判断等都需要仔细考虑进去以免引发错误行为或者异常情况发生。 #### 边界条件注意事项 当涉及到循环双链表的实际编程练习时,除了正常流程外还需要特别注意一些特殊情况的发生概率及其应对措施: - 列表为空(`head==nullptr`) - 只存在唯一的一个元素构成整个列表(self-loop structure) - 给定目标节点不存在于现有链条之中 这些情形都应该提前做好充分验证才能保证最终解决方案具备鲁棒性和可靠性[^3]. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值