利用新链表:
思路:
1.定义一个新的链表;
2.从头到尾遍历原来的链表,每遍历一个节点,将其取出,并且将其放在新的链表的最前端,也就是第一个有效结点;
3.将原来的链表的head.next = 新的链表的head.next。
主要代码:
public void reverSetList(){ //如果链表为空或者链表只有一个元素,无需反转 if(this.head.next == null || this.head.next.next == null){ return; } //定义一个辅助变量,遍历原来的链表 Node index = this.head.next; Node cur = null; //指向当前节点[index]的下一个节点 Node reverHead = new Node<E>((E)new Object(),null); //定义一个新的节点 //遍历原来的链表 while (index != null){ cur = index.next;//暂时保存当前节点的下一个节点 index.next = reverHead.next; //将index的下一个节点指向新链表的最前端 reverHead.next = index; index = cur; //index后移 } this.head.next = reverHead.next; //原来链表指向新的节点的最前端 }
利用原链表:
定义三个指针(一个标记每次逆序的链表的头,一个作为基准,另一个作为下次要逆序的值)
假如要逆序的链表如下图:
其主要过程:
分析上图:经过第一步将数据1与数据2之间的联系断开,与数据三建立联系,第二步将数据2与数据3之间的联系断开,与数据1建立联系,并且将头结点指向p1,也就是更新head。重复上面操作,直到p1指向null。
具体代码如下:
/** * 逆置单链表 * @param node 链表头结点 */ public static Node inversion(Node node){ if(node == null){ //此处应该加入判断只有一个节点的情况,也不需要反转 System.out.println("Linked is empty"); } Node head = node; //头指针 Node p = node; //固定指针 Node p1 = node.next; //后指针 while (p1 != null){ p.next = p1.next; p1.next = head; head = p1; p1 = p.next; } return head; }