从无头单链表中删除节点

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;
  }
 }

}
时间: 2024-12-17 03:43:43

从无头单链表中删除节点的相关文章

编程之美:从无头单链表中删除节点,讨论

1.问题描述 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除. 如下图所示: 这种情况大家都知道,将下一个节点的data和next拷贝到当前节点,并将当前节点的next设置为下下个节点,然后释放下一个节点所占内存(free), 如果红字条件去掉: 还用上面的方法就有问题,一般上面方法的代码如下: void DeleteRandomNode(Node* pCurrent) { if(pCurrent == NULL) ret

3.4 从无头单链表中删除节点

题目:有一个单链表,没有头指针,现在有一个指针指向这个链表的中间的一个节点,要求删除这个节点. 方法:由于没有办法寻求指针去找到要删除的这个节点的前一个节点. 所以要另想办法. 设立新的指针指向要删除的节点的后一个节点,然后把这两个节点里面的数据换一下!然后删除要删除节点的后一个节点! 这样 就ok了! 代码: void DeleteRandomNode(node *pCurrent) { assert(pCurrent != NULL); node *pNext = pCurrent->nex

【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】

[083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted linked list, delete all duplicates such that each element appear only once. For example, Given 1->1->2, return 1->2. Given 1->1->2

删除单链表中的节点

最近看到Linus在采访中提到一种删除单链表中节点的方法,并说不懂这种方法的人都不理解指针,原话如下: At the opposite end of the spectrum, I actually wish more people understood the really core low-level kind of coding. Not big, complex stuff like the lockless name lookup, but simply good use of poi

从单链表中删除最大的元素,单链表元素排序

public class LinkList { public Node head; public LinkList() { head = new Node(); head.next = null; } //尾插法 public void createByTail(int[] arr, int n) { Node tail = head; for(int i=0; i<n; i++) { Node c = new Node(arr[i]); tail.next = c; tail = c; } t

LeetCode 237 Delete Node in a Linked List(在链表中删除节点)

翻译 给定一个访问节点的路径,写一个函数去删除在一个单向链表中除尾部以外的节点. 假设这个链表是1 -> 2 -> 3 -> 4,并且你被给予了第3个值为3的节点,那么在调用你的函数之后这个链表应该变为1 -> 2 -> 4. 原文 Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed the l

在单链表中删除指定值的节点

问题描述: 给定一个链表的头结点head和一个整数num,请实现函数将值为num的节点全部删除. 例如:链表为1->2->3->5->3->6->null,num=3,调整后的链表为: 1->2->5->6->null 算法实现: public class Node { public int value; public Node next; public Node(int value) { this.value = value; }} 算法1:

【LeetCode-面试算法经典-Java实现】【203-Remove Linked List Elements(删除单链表中的元素)】

[203-Remove Linked List Elements(删除单链表中的元素)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5

javascript中的链表结构—从链表中删除元素

1.概念 上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remove()方法. 从链表中删除节点的时候,需要先找到这个待删除节点的前面的节点.找到这个节点之后修改它的next属性,使其指向待删除节点的下一个节点,这样就把待删除节点给删除了,是不是很简单呢?但是问题来了,我们是不是要找到待删除节点的前面一个节点呢?这样就需要添加一个findPrevious()方法来