题目I:输入一个链表,反转链表之后,输出链表所有元素。
分析:设三个指针,分别指向当前结点p,当前结点的前一个结点q和后一个结点r。断开过程为p.next=q;q=p;r=p.next;
public ListNode ReverseList(ListNode head) {
ListNode currentNode=head;
ListNode preNode=null;
ListNode ReverseHead=null;
while(currentNode!=null){
ListNode nextNode=currentNode.next;
if(nextNode==null){
ReverseHead=currentNode;
}
currentNode.next=preNode;
preNode=currentNode;
currentNode=nextNode;
}
return ReverseHead;
}
题目II:
分析:
- 由于m=1时会变动头结点,所以新建一个dummy头结点。
- 找到原链表中第m-1个节点start:反转后的部分将接回该节点后。
- 将从p = start->next开始,长度为L = n-m+1的部分链表反转,使用头插法反转。
- 最后接回。用一个变量保存p,最后只需要接回后半部分。
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: ListNode head is the head of the linked list
* @param m: An integer
* @param n: An integer
* @return: The head of the reversed ListNode
*/
public ListNode reverseBetween(ListNode head, int m, int n) {
// write your code here
if(head==null) return null;
ListNode dummy=new ListNode(-1);
dummy.next=head;
head=dummy;
for(int i=1;i<m;i++){
if(head==null) return null;
head=head.next;
}
ListNode preM=head;
ListNode mNode=head.next;
ListNode temp=mNode;
for(int i=m;i<=n;i++){
ListNode next=mNode.next;
mNode.next= preM.next;
preM.next=mNode;
mNode=next;
}
temp.next=mNode;
return dummy.next;
}
}