从无头单链表中删除节点
2015-06-13 16:24
387 查看
1、从无头单链表中删除节点
一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点)。将该节点删除。
A——>B——>C——>D =====》 A——>C——>D
问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C;
这里有个技巧,将C当做B,而B复制成C,则删除C节点即可;
2、给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来。
A——>B——>C——>D =====》 A<——B<——C<——D
问题解析:由于只能单向遍历,假设A——>B已经反转完成,现实现B<——C;可知由C.pNext = B即可;故每次循环需要保留B和C节点的值;
而翻转后,C无法再指向D会出现链表断裂;故在反转前要注意保留D,即C.pNext;
class ListNode
{
int pValue;
ListNode pNext;
public ListNode(int pValue,ListNode pNext)
{
this.pNext = pNext;
this.pValue = pValue;
}
}
public class LinkListEx {
public ListNode reverse(ListNode pHead)
{
if (pHead == null || pHead.pNext == null)
return pHead;
ListNode pNodeA = pHead;
ListNode pNodeB = pHead.pNext;
ListNode pNodeC = pHead.pNext.pNext;
pHead.pNext = null;
while(pNodeB != null)
{
pNodeB.pNext = pNodeA;
pNodeA = pNodeB;
pNodeB = pNodeC;
if (pNodeB != null)
pNodeC = pNodeB.pNext;
}
return pNodeA;
}
public void delete(ListNode pNode)
{
if (pNode == null || pNode.pNext == null)
return;
//由于题设中简化了难度,假设pNode既非头结点,也非尾节点,故其实不许进行边界判断
ListNode pNext = pNode.pNext;
pNode.pValue = pNext.pValue;
pNode.pNext = pNext.pNext;
}
public static void main(String[] args)
{
ListNode p5 = new ListNode(5, null);
ListNode p4 = new ListNode(4, p5);
ListNode p3 = new ListNode(3, p4);
ListNode p2 = new ListNode(2, p3);
ListNode p1 = new ListNode(1, p2);
LinkListEx linkListEx = new LinkListEx();
// linkListEx.print(linkListEx.reverse(p1));
linkListEx.delete(p3);
linkListEx.print(p1);
}
public void print(ListNode pHead)
{
while(pHead != null)
{
System.out.println(pHead.pValue + "==>");
pHead = pHead.pNext;
}
}
}
一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点)。将该节点删除。
A——>B——>C——>D =====》 A——>C——>D
问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C;
这里有个技巧,将C当做B,而B复制成C,则删除C节点即可;
2、给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来。
A——>B——>C——>D =====》 A<——B<——C<——D
问题解析:由于只能单向遍历,假设A——>B已经反转完成,现实现B<——C;可知由C.pNext = B即可;故每次循环需要保留B和C节点的值;
而翻转后,C无法再指向D会出现链表断裂;故在反转前要注意保留D,即C.pNext;
class ListNode
{
int pValue;
ListNode pNext;
public ListNode(int pValue,ListNode pNext)
{
this.pNext = pNext;
this.pValue = pValue;
}
}
public class LinkListEx {
public ListNode reverse(ListNode pHead)
{
if (pHead == null || pHead.pNext == null)
return pHead;
ListNode pNodeA = pHead;
ListNode pNodeB = pHead.pNext;
ListNode pNodeC = pHead.pNext.pNext;
pHead.pNext = null;
while(pNodeB != null)
{
pNodeB.pNext = pNodeA;
pNodeA = pNodeB;
pNodeB = pNodeC;
if (pNodeB != null)
pNodeC = pNodeB.pNext;
}
return pNodeA;
}
public void delete(ListNode pNode)
{
if (pNode == null || pNode.pNext == null)
return;
//由于题设中简化了难度,假设pNode既非头结点,也非尾节点,故其实不许进行边界判断
ListNode pNext = pNode.pNext;
pNode.pValue = pNext.pValue;
pNode.pNext = pNext.pNext;
}
public static void main(String[] args)
{
ListNode p5 = new ListNode(5, null);
ListNode p4 = new ListNode(4, p5);
ListNode p3 = new ListNode(3, p4);
ListNode p2 = new ListNode(2, p3);
ListNode p1 = new ListNode(1, p2);
LinkListEx linkListEx = new LinkListEx();
// linkListEx.print(linkListEx.reverse(p1));
linkListEx.delete(p3);
linkListEx.print(p1);
}
public void print(ListNode pHead)
{
while(pHead != null)
{
System.out.println(pHead.pValue + "==>");
pHead = pHead.pNext;
}
}
}
相关文章推荐
- kd树(k-dimensional tree)(1)
- 线程池相关
- 九度OJ-题目1508:把字符串转换成整数
- js页面跳转整理
- C++学习笔记之---boolalpha
- 16-m-3Sum Closest
- 使用Apache POI将ppt截屏成png格式(+背景和图片)
- Splay树(区间更新)—— POJ 3468 A Simple Problem with Integers
- -写霸-Android 实现字体识别(二)
- Openerp命令行接口:odoo.py
- Jquery easyui开启行编辑模式增删改操作
- gtest 学习之二测试函数功能
- hiho一下 第四十九周 欧拉路
- excel 经验总结
- 求数组a[N]中第i(1<=i<=n)小的数(2012年某公司实习生招聘面试试题)
- 多种相似距离对比
- linux下文件的读写操作
- JAXB注解使用[转]
- CrossApp应用源码集合贴
- Win32_API注册表类的编制以及使用